情感识别基于K近邻分类算法的语音情感识别matlab 源码
Posted Matlab走起
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了情感识别基于K近邻分类算法的语音情感识别matlab 源码相关的知识,希望对你有一定的参考价值。
一、简介
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
三、运行结果
四、备注
完整代码或者代写添加QQ1575304183
以上是关于情感识别基于K近邻分类算法的语音情感识别matlab 源码的主要内容,如果未能解决你的问题,请参考以下文章
情感识别基于matlab GUI SVM语音情感识别(带面板)含Matlab源码 876期