音频数据分析、PCA降维应用实例、TSNE降维、三维绘图——python

小老师让我在之前分析的情绪数据结果的基础之上,对原始数据进行分析,首先让我用PCA降维一下看看数据分布,然后换了TSNE降维。

真的是小白一枚呜呜呜~每次一个小任务我都要想好久,还会有很多bug

这次任务,我学会了有问题去找官方网站的说明文档,比如要用PCA,我用的是sklearn.decomposition.PCA,然后就去sklearn官网里面找到函数,并且这个函数还有 应用实例!

然后我选了 PCA example with Iris Data-set 这个例子进行学习,参考链接:PCA example with Iris Data-set — scikit-learn 1.0.1 documentation

虽然代码也不多,也看得懂,但是小白你懂吧,一点点水花都觉得是好大一个浪。

首先我用的数据和这个例子的数据不同,所以我又去看了下例子用的数据类型,(代码里都有超链接,就很nice)。

其实主要问题就是怎么把pca代码迁移到我的数据集上,所以我就开始分析X,Y的数据类型,iris数据集是分成了三类:

 对照着,我的数据集是把情绪分成了7类,但是我先选3种情绪分析。

1、先导入库

import sys,os,glob,pickle
import librosa as lb #音频和音乐处理
import soundfile as sf 
import numpy as np
import random
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from mpl_toolkits.mplot3d import Axes3D

2、创建情绪数据集

这一步,我学会了创建字典,以及怎么将按照文本分类的标签映射成数字标签,因为最后的画图函数里面,颜色参数是需要数字类型的。

emotion_labels = {
  'calm':0,
  'happy':1,
  'sad':2,
  'angry':3,
  'fear':4,
  'disgust':5,
  'surprise':6
    }
focused_emotion_labels = set(['calm','sad','happy'])

3、MFCC音频数据处理函数:

def audio_features(file_title, mfcc, chroma, mel):
    with sf.SoundFile(file_title) as audio_recording:
        audio = audio_recording.read(dtype="float32")
        sample_rate = audio_recording.samplerate
        if len(audio.shape) != 1:
            return None
        result=np.array([])
        if mfcc:
            mfccs=np.mean(lb.feature.mfcc(y=audio, sr=sample_rate, n_mfcc=40).T, axis=0)
            result=np.hstack((result, mfccs))
        if chroma:
            stft=np.abs(lb.stft(audio))
            chroma=np.mean(lb.feature.chroma_stft(S=stft, sr=sample_rate).T,axis=0)
            result=np.hstack((result, chroma))
        if mel:
            mel=np.mean(lb.feature.melspectrogram(audio, sr=sample_rate).T,axis=0)
            result=np.hstack((result, mel))
       # print("file_title: {}, result.shape: {}".format(file_title, result.shape))
        return result

4、构建一个准备数据的函数

这里包括怎么将自己的数据集读进来,怎么选择自己需要的情绪特征,在这里我用print函数来查看自己的数据内容,这也是目前我会的debug方法。

def pre_dataset():
    x = []
    y = []
    for file in glob.glob("./test_data//*//*.wav"):
        file_path = os.path.basename(file) #返回绝对路径下的文件名
        emotion = file_path.split(",")[1]
        if emotion not in focused_emotion_labels:
             continue
        feature = audio_features(file, mfcc=True, chroma=False, mel=False)
        if feature is None:
            continue
        x.append(feature)
        y.append(emotion_labels[emotion])
    array_data = np.array(x)
    data = np.array(y)
    #print(array_data.shape)
    #print(data.shape)
    return array_data,data 

5、3D绘图部分

这里也是我自己不会调,请教了小老师的部分,我对3d绘图函数不了解,不知道参数怎么设置,从例子里面copy过来的代码,企图先读懂再改。

x_data,y = pre_dataset()
fig = plt.figure(1, figsize=(4,3))
plt.clf()
ax = Axes3D(fig, rect=[0, 0, 0.95, 1], elev=48, azim=134)
plt.cla()

pca = decomposition.PCA(n_components=3)
pca.fit(x_data)
X = pca.transform(x_data) #降到三维
#print(X)

for name in [0, 1, 2]:  #  ["calm", "sad", "happy"]
    ax.text3D(
        X[y == name, 0].mean(),
        X[y == name, 1].mean() + 2,
        X[y == name, 2].mean(),
        name,
        horizontalalignment="center",
        bbox=dict(alpha=0.5, edgecolor="w", facecolor="w"),
    )
#Reorder the labels to have colors matching the cluster results
#y = np.choose(y, ["calm", "angry", "happy"]).astype(float) 这里只是将标签调整了下顺序,不太需要就没用了
ax.scatter(X[:, 0], X[:, 1], X[:, 2],c=y, cmap=plt.cm.nipy_spectral, edgecolor="k")

ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])

plt.show()

主要是for循环那里我不懂,小老师跟我说用[0, 1, 2]而不是用 ["calm", "sad", "happy"]是因为前面已经将文本标签转换成数字标签了

ax.text3D(
        X[y == name, 0].mean(),
        X[y == name, 1].mean() + 2,
        X[y == name, 2].mean(),
        name,
        horizontalalignment="center",
        bbox=dict(alpha=0.5, edgecolor="w", facecolor="w"),
    )

还是不太明白这里的三个mean()取得是什么值,是三维坐标轴的均值吗?还是三种特征数据的均值呢?

6、结果

我的数据集是三个特征,共46个sample,40维特征 

 

从结果可以看到PCA降维下来效果不明显啊啊啊!

7、TSNE降维

然后试了下tsne降维方法

其实就是把这里:


pca = decomposition.PCA(n_components=3)
pca.fit(x_data)
X = pca.transform(x_data) #降到三维
#print(X)

换成了:

pca_tsne = TSNE(n_components=3)  
X = pca_tsne.fit_transform(x_data)  
#print(X)

最后结果是:

效果也不怎么好

因为之前模型跑出来的结果显示标签0的准确率很高,所以企图看到标签0的分类效果很好,也就是相对比较集中,但是降维结果并不能得到这个结论。所以小老师让我不要用降维数据,用原始数据试试,在原始数据上面用LR线性模型训练一下,看看效果如何。但是目前我还不会,我查了LR的应用实例,是三分类的,只能处理有二维特征的数据,而我的数据是40维,我不知道怎么改呜呜呜~再看看吧,会了再更~ 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值