使用高斯混合模型(GMM)进行猫狗音频聚类(Kaggle Audio Cats and Dogs)

Audio Cats and Dogs | Kaggle

目录

一、实验目标

二、数据分析

三、实验结果

四、改进方向


一、实验目标

        数据集包括164个标注为猫的.wav文件,总共1323秒和113个标注为狗叫声的.wav文件,总共598秒,要求判别每个音频是狗叫还是猫叫

二、数据分析

        随机播放了一些音频,然后使用下面的代码输出了他们的声谱图、频率随时间变化和梅尔倒频率系数的热力图:

# 读取音频文件
Audio = np.array(librosa.load('./cats_dogs/cat_86.wav')[0])
SampleRate=librosa.load('./cats_dogs/cat_86.wav')[1]
# 绘制声谱图
plt.plot(Audio)
plt.show()
#绘制频率随时间变化的波形图
plt.specgram(Audio, Fs = SampleRate)
plt.show()
#绘制梅尔频率倒谱系数热图
MFCC = librosa.feature.mfcc(y = Audio, sr = SampleRate)
plt.imshow(MFCC, cmap = 'hot')
plt.show()

        发现一些音频10秒左右的长度中只有不到3秒的动物叫声,其他都是一些杂音,在6s左右的地方还是能看出来猫的声音特征的:

cat_1.wav:

有一些音频是没有动物叫声的,只有杂音,从频率图可以看出没有猫的特征:

cat_41.wav

还发现了一个音乐片段,也是与猫的特征完全不同:

cat_123.wav:

也有最容易辨别的,只有叫声的音频,猫的特征最为明显:

cat_9.wav

狗叫声听上去大部分都比较正常(不过也发现有像dog_barking_108.wav是杂音)

dog_barking_39.wav:

        其他的音频就不过多展示了,可以看出猫叫声的频率在2000及以上最高,狗叫声频率分布在2000以下,猫叫声的MFCC热力图颜色浅,而狗的热力图颜色深

三、实验探究不同参数的影响

        我们这里选择了差距看上去更大一点的MFCC作为音频特征,更准确的说是MFCC均值,构建高斯混合模型,并使用期望最大化算法进行训练,代码如下:

#音频特征
Features = []
#音频标签
Labels = []
#遍历277个音频文件
for File in os.listdir("./cats_dogs"):
    #获取音频时间序列和采样率 
     y, sr = librosa.load("./cats_dogs/"+File)
     #计算音频的MFCC
     #MFCC的计算过程通常包括以下几个步骤:对原始信号进行傅里叶变换,以将其从时域转换到频域;接着将线性频率尺度转换为梅尔频率尺度;然后通常取其对数并施加离散余弦变换(DCT),最终得到倒谱系数。
     MFCC = librosa.feature.mfcc(y=y, sr=sr,n_mfcc=100)
     #计算MFCC的平均值作为特征
     Features.append(np.mean(MFCC, axis=1))
     if File[0]=='c':
         Labels.append(0)
     else:
         Labels.append(1)

Features=np.array(Features)
Labels=np.array(Labels)
#构建高斯混合模型
GMM=GaussianMixture(n_components=2,covariance_type='full',tol=1e-3,reg_covar=1e-6,max_iter=100,n_init=1,random_state=2)
#通过期望最大化算法对模型进行聚类并预测
GMM.fit(Features)
Predictions = GMM.predict(Features)
#输出测试的准确率
Accuracy = accuracy_score(Labels, Predictions)
print(confusion_matrix(Labels,Predictions))
print("Accuracy:", Accuracy)

1.默认参数

        首先用的是默认参数,两个单高斯模型,每个分量有不同的协方差矩阵,收敛阈值1e-3,协方差正则化参数1e-6,EM算法最大迭代次数100,随机初始化1次,随机数种子=2,初始化参数方法Kmeans

结果:

        

通过混淆矩阵可以看出,狗的正确率达到了64%,而猫的正确率只有54%,这个差距应该和数据集有关,标注为狗的音频质量比猫要高一些

2.协方差正则化参数

        先改这个参数的原因是本来想先改协方差矩阵,但是改了后发现提示拟合失败,建议提高正则化参数,以下是正则化参数=[1e-6,1e-5,1e-4,1e-3,1e-2,1e-1,1]时的结果

只有等于1时出现了准确率下降,其他值时对准确率没有影响

        从理论上来说,当正则化参数较大时,协方差矩阵会更倾向于接近于0,有助于减少模型复杂度,可以避免过拟合,但可能会引入偏差,而且本实验因为数据集很小,所以没有分训练集和测试集;当正则化参数值较小时,模型能够更好地捕捉到数据的真实分布,但也容易过度拟合,也可能因为过于复杂出现拟合失败。

        后续实验中采用1e-5这个值,在保证不会拟合失败的前提下增加模型的复杂度

3.协方差类型

        协方差类型决定了模型在处理特征间的相关性和数据分布的假设,采用了4种协方差矩阵模式,[full,tied,diag,spherical]

            

        完全协方差(full)中 每个高斯分量都拥有独立的一般协方差矩阵,能够处理分量间复杂的形状和方向差异,需要估计更多的参数。

        共享协方差(tied)中所有高斯分量共享同一个一般协方差矩阵。减少了需要估计的参数数量,降低了模型复杂性。

        对角协方差(diag)中协方差矩阵只有对角线上的元素是非零,这意味着模型只考虑每个特征与自身的方差,忽略了特征间的协方差,进一步减少了模型的复杂度。

        球形协方差 (‘spherical’)中每个高斯分量具有相同的球形协方差,更进一步简化了模型。是参数设置中最简单的模型,计算需求最低。

        从图表中可以看出大致趋势是模型复杂度越低准确率越高,这可能是因为该数据集的质量过低导致的,而球形协方差复杂度过低也会导致拟合准确率下降,后续实验都采用效果最好的对角协方差。

        4.容忍度和最大迭代次数

        容忍度(tolerance)参数,用于控制在期望最大化算法迭代过程中,似然性或下界的变化小于何值时阈值时收敛。我们得到的结果是容忍度越大准确率越高,而在低于1e-3时也没有zh,可能依然时因为数据集质量过低,算的多反而不准确,后续实验采用准确率最高的1e-3。

        最大迭代次数(max_iter)指的是期望最大化算法在达到该迭代次数后,即使没有满足容忍度,也会提前终止,该结果同样证明了对于该数据集来说算的越多准确率可能越低

5.初始化次数        

        初始化次数决定了算法尝试寻找模型最佳参数的次数,在调整次数之前先取消设定随机数种子

        

        通过多次初始化,可以降低模型因单次不幸运的初始化导致收敛到局部最优或不合理的结果的风险。所以提高初始化次数可以一定程度上的提高准确率,单不需要过高,因为其会明显影响运算时间

四、改进方向

        要提高正确率,首先可以对数据进行清晰,包括对音频中无关部分进行裁剪,去除无关音频,具体清洗方法也许可以从频率图入手

        其次可以对GMM模型进行调参,以及尝试使用频率作为特征等

        

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 高斯混合模型GMM聚类是一种机器学习方法,它是将数据集分成多个高斯分布的集合的过程。MATLAB中有一个专门用于GMM聚类的函数gmdistribution,可以用来确定数据集中存在的高斯分布的数量。通过使用该函数,可以将数据集分成不同的聚类。当然,可以使用其他聚类方法,例如K均值聚类,但GMM聚类具有以下优点: 1. 在确定聚类的数量时更加灵活,因为可以使用概率模型来估计每个聚类的权重。 2. 可以处理非球形簇,这是K均值聚类无法处理的。 3. 可以估计聚类的不确定性。 为了使用gmdistribution函数进行聚类,需要将待聚类数据集作为参数传递给函数。还必须指定每个高斯分布的数量。最后,gmdistribution函数需要一个初始值矩阵来初始化每个高斯分布。可以选择从数据集中选取初始值,也可以使用一组随机值来初始化。在运行gmdistribution函数后,将返回一个包含数据点所属聚类的向量。可以使用这些向量来进一步分析和可视化数据。 总之,GMM聚类是一种有用的机器学习技术,可用于将数据集分成不同的聚类。MATLAB中的gmdistribution函数可帮助用户确定聚类的数量和每个高斯分布的初始值,聚类之后可以进一步分析和可视化数据点。 ### 回答2: 高斯混合模型GMM)是一种基于概率分布建立的聚类方法。它假设每个聚类都可以用多个高斯分布来拟合,而这些高斯分布的加权和就形成了整个数据集的概率密度函数。Matlab提供了GMM聚类算法的实现,可以方便地进行聚类操作。 在Matlab中,通过调用gmdistribution函数可以建立一个GMM模型,并用数据集进行初始化。该函数的参数包括聚类数目、协方差类型、初始化方式等。在得到GMM模型后,可以使用fit函数对数据集进行拟合。fit函数会返回每个数据点属于每个聚类的概率值。 在对数据进行聚类后,可以使用gmdistribution对象的其他函数进行分析和可视化,如pdf函数可以计算某个点属于每个聚类的概率密度值,cluster函数可以给出数据集中每个点所属的聚类,plot函数可以绘制聚类的概率密度函数。此外,Matlab还提供了一些有关GMM的其他函数,如gmdistribution.fit和gmdistribution.random,可以用来生成满足GMM模型的数据集和对新数据进行预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timidcatt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值