情感识别基于改进KNN语音情感分类识别malab源码含GUI

Posted Matlab咨询QQ1575304183

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了情感识别基于改进KNN语音情感分类识别malab源码含GUI相关的知识,希望对你有一定的参考价值。

一、简介

KNN算法

KNN是通过测量不同特征值之间的距离进行分类。具体思路是:如果一个样本在特征空间中的k个(欧氏距离或马氏距离等)距离最近即特征空间中最邻近的样本中的大多数属于某一个类别,则该样本也属于这个类别,通常K是不大于20的整数。KNN算法中,所选择的的邻居都是已经正确分类的对象即原始训练数据。该方法在定类决策上只一句最邻近的一个或者几个样本的类别来决定带份样本所属的类别。简单地说在一个N维属性的空间内,哪一类点距离他的距离最近,或者是以它为半径的园内的电中数量最多的类别是哪个,我们就认为这个未知的点就属于该类别。所以KNN是通过依据k个对象中占优的类别进行决策,而不是单一的对象类别决策(k=1)。因此这个算法的结果很大程度上是由K决定的,对线性和聚类分布有较好的指标。在KNN中,通过计算对象间距来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离欧氏距离和曼哈顿距离表达式
这也是KNN的特点和优势所在。
KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

特征提取方法

简介

特征提取方法有很多种,这里采取欧式距离度量的特征提取方案。
由于原始特征的数量很大,或者说样本是处于一个高维空间中,通过映射(或变换)的方法可以用地位空间来表示样本,这个过程就叫做特征提取。映射后的特征叫而此特征,他们是原始特征的某种组合(通常是线性组合)。所谓特征提取在广义上就是指一种变换。若Y是测量空间,X是特征空间,则变换A:Y→X就叫做特征提取器。而从一组特征中挑选中一些最有效的特征以达到降低特征空间维数的目的,这个过程叫做特征选择。一般都是挑选对分类器最有影响的特征或采用其他数学方法来帅选并比较,找出最优分类信息的特征。通过对上述特征提取方法的分析,选在最有效的特征,作为新的特征。
特征选择与提取的任务是求出一组对分类最有效的特征,因此我们需要一个定量的准则(或称作判据)来衡量特征对分类的有效性。具体来说,把一个高维空间变换为地位空间的映射有很多,而哪种映射对分类最有利没需要一个比较标准。从D个原始特征中选择出d的特征的各种可能组合也是很多的,哪种组合的分类效果最好,也要有一个比较标准。
两个特征向量之间的距离使他们相似度的一种很好的度量。假设对应同一类别的样本在特征空间中聚集在一起,而不同类别的样本互相离得比较远,分类就比较容易实现。因此在给定维数为D的特征空间中,我们应采用这样的d个特征,他们使各类尽可能远地相互分开。在上一节中我们已经指出,假设用表示第wi类的第k个样本与wj类的第l个样本之间的距离,我们应该选择这样的特征x*,使c个类别个样本的平均距离为最大,即

具体步骤

假设有D个原始特征,希望通过线性映射压缩为d个特征:,其变换关系为,经过变换后的变为,对于来说使盘踞达到最大的变换W如下:
设矩阵的本征值为,按大小顺序排列为:

则选前d个本征值对应的本征向量作为W。即

此时为:

基本参数

各类样本均值向量mi:
样本类内离散度矩阵Si和总类内离散度矩阵Sw


样本类内离散度矩阵Sb

二、源代码

clc;
close all;
defcolor=[0,0,0];
h_fig=figure(1);
set(h_fig,'Menubar','name','语音情感识别系统 v1.0',...
    'Numbertitle','off',...
    'color',[0.9023    0.9074    0.8055]);
h_text=uicontrol(h_fig,'style','text','unit','normalized',...
    'position',[0.0,0.0,1,1]);
h_text1=uicontrol(h_fig,'style','text','unit','normalized',...
    'position',[0.0,0.85,0.25,0.05],'horizontal','left',...
    'string','请选择待检测wav文件:','fontsize',10,'ForegroundColor',defcolor);
h_edit1=uicontrol(h_fig,'style','edit','unit','normalized',...
    'position',[0.28,0.80,0.5,0.1],'horizontal','left',...
   'fontsize',10, 'ForegroundColor',defcolor);
h_push3=uicontrol(h_fig,'style','push','unit','normalized',...
    'position',[0.78,0.8,0.08,0.1],'horizontal','left',...
    'string','...','fontsize',20,'ForegroundColor',defcolor,'callback','getfile');
h_push1=uicontrol(h_fig,'style','push','unit','normalized',...
    'position',[0.4,0.75,0.18,0.05],'horizontal','left',...
    'string','确定','fontsize',10,'ForegroundColor',defcolor,'callback','process');
h_text3=uicontrol(h_fig,'style','text','unit','normalized',...
    'position',[0,0.5,0.28,0.1],'horizontal','left',...
    'string','传统KNN算法获得结果为:','fontsize',10,'ForegroundColor',defcolor);
h_edit2=uicontrol(h_fig,'style','edit','unit','normalized',...
    'position',[0.28,0.5,0.3,0.1],'horizontal','left',...
    'fontsize',10,'ForegroundColor',defcolor);
    [y,fs]=wavread(filename);
sound(y,fs)
X3=mean(FunFre(y,fs));
[X1,X2,X4]=TimePara(y);
k=13;
XA=[Aa Ah As X1];XE=[Ea Eh Es X2];XF=[Fa Fh Fs X3];XZ=[Za Zh Zs X4];  
PA=mapzo(XA);PE=mapzo(XE);PF=mapzo(XF);PZ=mapzo(XZ);
a=[PA(1:30);PE(1:30);PF(1:30);PZ(1:30)];
h=[PA(31:60);PE(31:60);PF(31:60);PZ(31:60)];
s=[PA(61:90);PE(61:90);PF(61:90);PZ(61:90)];
x=[PA(91);PE(91);PF(91);PZ(91)];
%%%传统KNN算法
disp('使用传统KNN算法识别结果为:')
A=oushi(a,x);
H=oushi(h,x);
S=oushi(s,x);
set(h_edit2,'style','text');
set(h_edit2,'string',judge(A,H,S,k));
%%%%%%%改进算法
disp('使用改进算法识别结果为:')
B=mean([Aa' Ah' As' Ea' Eh' Es' Fa' Fh' Fs' Za' Zh' Zs']);
A=reshape(B,3,4);
O=reshape([Aa Ah As],30,3);
for i=1:3
    for j=1:30
     OO(j,i)=(abs(O(j,i)-A(i,1))/A(i,1))^2;
    end
end
O=sqrt(sum(OO));
P=reshape([Ea Eh Es],30,3);
for i=1:3
    for j=1:30
     PP(j,i)=(abs(P(j,i)-A(i,2))/A(i,2))^2;
    end
end
P=sqrt(sum(PP));
Q=reshape([Fa Fh Fs],30,3);
for i=1:3
    for j=1:30
     QQ(j,i)=(abs(Q(j,i)-A(i,3))/A(i,3))^2;
    end
end
Q=sqrt(sum(QQ));
R=reshape([Za Zh Zs],30,3);
for i=1:3
    for j=1:30
  RR(j,i)=(abs(R(j,i)-A(i,4))/A(i,4))^2;
    end
end
R=sqrt(mean(RR));
X=[O' P' Q' R'];
for i=1:3
    for j=1:4
       V(i,j)=(sum(X(i,:))-X(i,j))/sum(X(i,:));
    end
    function [str]=judge(A,H,S,k)
f=[A H S];  %将欧距三个个矩阵合并
g=[A H];
d=numel(f);
c=[1:d];                      %用来存放排序后的欧距
c=lowtohigh(f,d);
 num1=0;                         %用来记录被判x类的次数
 num2=0;                         %用来记录被判y类的次数
 num3=0;
 for i=1:k
    for j=1:d
        if (c(i)==f(j))
            if j<=numel(A)      %如果选中的欧距出自x类
            num1=num1+1;
            elseif  j>numel(g)             %如果选中的欧距出自y类
               num3=num3+1;
            else
               num2=num2+1;       
            end
        end
        j=j+1;
    end
    i=i+1;
 end 
 
 if(num1>num2&num1>num3)
     w=0;
 elseif(num2>num1&num2>num3) 
     w=1;
 elseif(num3>num1&num3>num2) 
     w=2;
 end
end

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码或者仿真咨询添加QQ1575304183

以上是关于情感识别基于改进KNN语音情感分类识别malab源码含GUI的主要内容,如果未能解决你的问题,请参考以下文章

张雪英部分论文集

情感识别基于matlab GUI SVM语音情感识别(带面板)含Matlab源码 876期

情感识别基于神经网络的语音情感识别

自然语言处理NLP之文本蕴涵智能问答语音识别对话系统文本分类情感计算

基于Matlab神经网络语音情感识别系统

基于树莓派的智能魔镜,支持人脸识别情感监测热词唤醒语音交互,以及与手机APP交互的实现