【情感识别】基于matlab KNN算法语音情感识别【含Matlab源码 542期】
一、 KNN算法简介
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
1 定义
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,即由你的“邻居”来推断出你的类别.
2 距离公式
两个样本的距离可以通过如下公式计算,又叫欧式距离
3 KNN算法的步骤
(1)计算已知类别数据集中每个点与当前点的距离;
(2)选取与当前点距离最小的K个点;
(3)统计前K个点中每个类别的样本出现的频率;
(4)返回前K个点出现频率最高的类别作为当前点的预测分类。
4 KNN原理
5 KNN的优缺点
6 KNN性能问题
NN的性能问题也是KNN的缺点之一。使用KNN,可以很容易的构造模型,但在对待分类样本进行分类时,为了获得K近邻,必须采用暴力搜索的方式,扫描全部训练样本并计算其与待分类样本之间的距离,系统开销很大。
二、部分源代码
clc
clear all;
close all;
%% 载入各情感的特征向量矩阵
load A_fear.mat;
load F_happiness.mat;
load N_neutral.mat;
load T_sadness.mat;
load W_anger.mat;
NumberOfTrain=size(fearVec,2)/2; %一半测试用,一半训练用
trainVector=[fearVec(:,1:NumberOfTrain),hapVec(:,1:NumberOfTrain),neutralVec(:,1:NumberOfTrain),sadnessVec(:,1:NumberOfTrain),angerVec(:,1:NumberOfTrain)]; % 构建训练样本集
testVector=[fearVec(:,(NumberOfTrain+1):size(fearVec,2)),hapVec(:,(NumberOfTrain+1):size(hapVec,2)),neutralVec(:,(NumberOfTrain+1):size(neutralVec,2)),sadnessVec(:,(NumberOfTrain+1):size(sadnessVec,2)),angerVec(:,(NumberOfTrain+1):size(angerVec,2))]; % 构建测试样本集
k=9; %k 最近邻
distanceMatrix=zeros(size(trainVector,2),size(testVector,2)); % 每一列表示某个测试语音与所有训练集样本的距离
%% 计算每个测试样本和训练样本集各样本的距离
for i=1:size(testVector,2)
for j=1:size(trainVector,2)
distanceMatrix(j,i)=norm(testVector(:,i)-trainVector(:,j)); %计算欧氏距离
end
end
%% 统计分类结果 (根据相应的特征向量在数组trainVector或testVector中所处的位置来辨别类型)
totalTestNumber=size(fearVec,2)-NumberOfTrain;
emtionCounter=zeros(1,5);
n1=NumberOfTrain;
n2=n1+NumberOfTrain;
n3=n2+NumberOfTrain;
n4=n3+NumberOfTrain;
n5=n4+NumberOfTrain;
p1=size(fearVec,2)-NumberOfTrain;
p2=p1+size(hapVec,2)-NumberOfTrain;
p3=p2+size(neutralVec,2)-NumberOfTrain;
p4=p3+size(sadnessVec,2)-NumberOfTrain;
p5=p4+size(angerVec,2)-NumberOfTrain;
if(n5~=size(trainVector,2)||p5~=size(testVector,2))
disp('data error')
return;
end
for i=1:size(distanceMatrix,2)
flag=zeros(1,5);
[sortVec,index]=sort(distanceMatrix(:,i));
% 统计K个近邻中各类别的数量
for j=1:k
if(n1>=index(j)&&index(j)>=1)
flag(1)=flag(1)+1;
elseif(n2>=index(j)&&index(j)>n1)
flag(2)=flag(2)+1;
elseif(n3>=index(j)&&index(j)>n2)
flag(3)=flag(3)+1;
elseif(n4>=index(j)&&index(j)>n3)
flag(4)=flag(4)+1;
else
flag(5)=flag(5)+1;
end
end
[~,index1]=sort(flag);
% 如果K个近邻中数量最多的类别与该样本实际的类别一致,则认为算法识别正确,相应counter加一。
if((p1>=i&&i>=1)&&index1(5)==1)
emtionCounter(index1(5))=emtionCounter(index1(5))+1;
elseif((p2>=i&&i>p1)&&index1(5)==2)
emtionCounter(index1(5))=emtionCounter(index1(5))+1;
elseif((p3>=i&&i>p2)&&index1(5)==3)
emtionCounter(index1(5))=emtionCounter(index1(5))+1;
elseif((p4>=i&&i>p3)&&index1(5)==4)
emtionCounter(index1(5))=emtionCounter(index1(5))+1;
elseif((p5>=i&&i>p4)&&index1(5)==5)
emtionCounter(index1(5))=emtionCounter(index1(5))+1;
end
end
function feature=featvector(filename)
[y,fs]=wavread(filename);
L=length(y);
ys=y;
for i=1:(length(y)-1)
if (abs(y(i))<1e-3) % 剔除较小值,计算短时能量时使用 %
ys(i)=ys(i+1);
L=L-1;
end
end
y1=ys(1:L);
s=enframe(y,hamming(256),128); % 分帧加窗 %
s1=enframe(y1,hamming(256),128);
[nframe,framesize]=size(s);
[nframe1,framesize1]=size(s1);
E=zeros(1,nframe1);
Z=zeros(1,nframe);
F=zeros(1,nframe);
for i=1:nframe
Z(i)=sum(abs(sign(s(i,framesize:2)-s(i,framesize-1:1))))/2; % 过零率 %
end
for i=1:nframe1
E(i)=sum(s1(i,:).*s1(i,:)); % 短时能量 %
end
s1=x2-x1;s2=x3-x4;
E_Reg_coff=s1/s2;
x=0;
for i=1:nframe1
t=E(i)-(mean(E)-s1/s2*x4/nframe1)-s1/s2*i;
x=x+t^2/nframe1;
end
E_Sqr_Err=x;
feature(1:7,1)=[max(E);min(E);mean(E);var(E);E_shimmer;E_Reg_coff;E_Sqr_Err];% 短时能量相关特征 %
% 能量比 %
feature(8,1)=Eratio;
end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019.
[2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,2019.
[3]叶斌.基于HMM和PNN的语音情感识别研究.[J]青岛大学学报(工程技术版). 2011,26(04)
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/114954101
- 点赞
- 收藏
- 关注作者
评论(0)