失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 针对IRIS数据的特征选择与提取方法研究(模式识别第四次作业)

针对IRIS数据的特征选择与提取方法研究(模式识别第四次作业)

时间:2019-08-21 21:04:28

相关推荐

针对IRIS数据的特征选择与提取方法研究(模式识别第四次作业)

针对IRIS数据的特征选择与提取方法研究

要求

对Iris数据进行两个特征选择,共6种组合,计算类别可分性准则函数J值,得出最好的分类组合,画出六种组合的分布图;

使用前期作业里面的程序、对6种组合分别使用不同方法进行基于120个训练样本30个测试样本的学习误差和测试计算,方法包括:最小距离法(均值点)、k近邻法(k取1、3、5)等; 简单说就是把样本从一种组合换成6种组合(以前作业选取前两种属性即前两维数据构成特征向量,本次作业测试6种不同组合)。 从错误率角度分析,6种组合中哪种最好?与基于可分性准则函数J值的判断是否一致。

采用PCA方法,对4维数据进行2维降维(先判断是否前两个主成分的贡献率是否超过75%),并进行可视化,研究可分性准则数据。

这次作业使用到以往的作业程序,各位同学可以考虑把过去的作业程序进行优化,构成函数,对比一下自己编程能力的变化。

基于可分性准则函数J值进行预测判断哪种特征组合最好

特征的选取与分类效果关系密切,一般来说越好的特征,分类效果越好,错误率越低。该实验中每个Iris样本都有四个属性,任选其中两个属性作为特征向量,共可以得到C_4^2共6种组合,根据6种不同的特征组合绘制二维图像,由此得到6种结果,运用距离可分性准则,共有3类,每类的中心点为mi,总的平均向量为m。J值计算过程如下:

类内离散度S_w:

S_i=∑_(xϵx_i)▒〖(x-m_i)〖(x-m_i)〗^T 〗

S_w=∑▒S_i

类间离散度S_b:

S_B=∑_(i=1)^c▒〖n_i (m_i-m)〗 〖(m_i-m)〗^T

J值:

J=(|S_b |)/(|S_w |)

且,J越大,错误率越小。

不同种可能性组合下,J值如下表2-1所示

组合 (1,2) (1,3) (1,4) (2,3) (2,4) (3,4)

J 1.2599 7.2627 2.9332 10.1236 3.8458 15.3779

表2-1 各组合下准则函数J 值

分析表3-1可知,由于1、2组合中的准则函数J值最小,样本可分性较差,而3、4组合中准则函数J最大,因而样本的可分性较好。

准则函数J的求取流程图如图2-1所示:

图2-1 准则函数J的求取流程图

基于PCA算法将4维数据降维

PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用减少数据集的维数,同时保持数据集的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面.但是,这也不是一定的,要视具体应用而定。画出PCA降维后PCA样本,如下图3-1所示

图3-1 PCA算法处理后训练样本分布图

经过计算PCA算法得出的J值为7.5038,S_w值为64.3259,S_B值为482.6874。将各组合J值与J_PCA对比,似乎并没有起到明显的保留特征结果,并降维的良好作用,但在一定程度上新生成的特征起到了一定作用,如下表3-1所示

组合 (1,2) (1,3) (1,4) (2,3) (2,4) (3,4) PCA

J 1.2599 7.2627 2.9332 10.1236 3.8458 15.3779 7.5038

表3-1 PCA处理后算出的J值与未处理各组合对比

PCA处理后用最近邻法和KNN近邻法计算错误率得出结果如下表3-2所示

计算方法方法 最近邻法 KNN1 KNN3 KNN5

错误率 10% 0% 0.83% 0.25%

表3-2 PCA处理后用各算法错误率对比

其具体流程图如图3-1下所示:

图3-1 PCA算法流程图

数据读取及二维显示

从4个的特征样本里面选取2种特征进行组合,进行二维显示。C_4^2=6种组合,我们人为地将4种特征进行编号:1,2,3,4。将这4中特征的6种组合表示为(1,2)、(1,3)、(1,4)、(2,3)、(2,4)、(3,4)。将这6种组合对应的二维图像,如图4-1、4-2、4-3、4-4、4-5、4-6表示:

图4-1 组合为(1,2)时分布图 图4-2 组合为(1,3)时分布图

图4-3 组合为(1,4)时分布图 图4-4 组合为(2,3)时分布图

图4-5 组合为(2,4)时分布图 图4-6 组合为(3,4)时分布图

分析比较上述图形可知:图4-1中第二类和第三类样本混杂程度较高,图4-6各样本自身均值中心越近,而各个均值相互距离较远。这与前面计算的J值预估的结果J(3,4)最大相一致。下面需要多种方法运行程序进一步印证。

最小距离法分析

方法描述:在本次实验中,选取各类数据的均值点为各自的代表点,因此,首先运用’mean’函数求取每组数据的平均值作为代表点,然后分别计算所有训练样本及测试样本到这两个特征点之间的欧氏距离d1和d2,并根据下列判断法则进行分类:

f(x)=d12-d22

{█(&f(x)>0⇒d1>d2 ⇒x∈"Iris-setosa" @&f(x)<0⇒d1<d2 ⇒x∈"Iris-versicolo" @&f(x)=0 ⇒拒绝分类)┤

最后,计算训练样本的学习错误率以及测试样本的测试错误率。

结果如下表5-1所示:

组合 (1,2) (1,3) (1,4) (2,3) (2,4) (3,4)

错误率 10.00% 6.67% 6.67% 3.33% 0% 0%

表5-1 最小距离法错误率分析

小结:最小距离法对于辨识该数据各项特征都有比较好的有较好的分辨度,

K近邻法分析

方法描述:k近邻法实际上就是近邻法的延伸,最近邻法的是k近邻法,k=1时的特例。我的实现思路是先确定一个k值,然后计算所有样本点与已知训练样本之间的距离装入一个矩阵中,然后将这些距离再有小到大的进行排列。取得前k个值,然后距离最近的这前k个值,进行“多数表决”,即前k个距离中哪一类样本占多,就将未知样本分到该类中。当k=1时,该方法就称为最近邻法,相比k近邻法,最近邻法更加简单。在使用k近邻法将分类完成后,统计结果,分析训练样本中和测试样本中分类错误的个数,计算各自错误率,来分析对Iris数据进行近邻法分类编程是否有较好的可信度。

最后,计算训练样本的学习错误率以及测试样本的测试错误率。

结果如下表6-1所示:

组合 (1,2) (1,3) (1,4) (2,3) (2,4) (3,4)

k=1错误率 36.67% 13.33% 3.33% 16.67% 0% 0%

k=3错误率 33.33% 3.33% 0% 6.67% 3.33% 0%

k=5错误率 26.67% 3.33% 0% 0% 3.33% 0%

表6-1 k近邻法错误率分析

总结

对以上所有工作列表处理,如下表7-1所示

方法 各组合

(1,2) (1,3) (1,4) (2,3) (2,4) (3,4) PCA

最近邻法 10.00% 6.67% 6.67% 3.33% 0% 0% 10%

KNN1 36.67% 13.33% 3.33% 16.67% 0% 0% 0%

KNN3 33.33% 3.33% 0% 6.67% 3.33% 0% 0.83%

KNN5 26.67% 3.33% 0% 0% 3.33% 0% 0.25%

J 1.2599 7.2627 2.9332 10.1236 3.8458 15.3779 7.5038

表7-1 各组合在各方法下错误率与J值计算对比

通过分析表格7-1,可以得出在这一组IRIS数据下,相对来说准确率最高的方法是最近邻法,综合其各项数据错误率都是最低的。

K近邻法中准确率相对较高的方法是KNN5,可见在一定程度上提高k的取值能够提高准确率,降低误差。

未经处理的组合中,(3,4)特征构成的组合正确率全部达到100%,由此可见(3,4)两个特征是最佳特征,应考虑其作为正确分辨IRIS三类花的优先特征选择。

通过计算方法得出的(3,4)特征组合效果最佳,与计算出来的J值结果一致,J越大分离效果越好

PCA处理后的结果对比未经处理的组合,在各种方法下正确率都得到了提高,由此应该认为是一次良好的处理结果

计算出PCA的J值却反而只有7.5远比不上最高的J(3,4)的15.3。综合错误率分析PCA效果良好,问题应该是出在J值上,可能原因是样本数量不足导致的J值偏差,算法本身局限性造成偏差等等。(严谨分析,错误率也是不准确的比如KNN方法应该加上Kd-tree才是最准确的分类方式,否则造成投票一致的情况就有可能会造成偏差。)所以,J值只能在一定程度上反映其可分效果指标,但不可以当做最终结果来倚仗。

附:具体程序如下所示:

主函数

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%该代码为对Iris数据进行多种分类编程测试%使用前期作业里面的程序、对6种组合分别使用不同方法进行基于120个训练样本30个测试样本的学习误差和测试计算%对Iris数据进行两个特征选择,共6种组合,计算类别可分性准则函数J值,得出最好的分类组合%采用PCA方法,对4维数据进行2维降维(先判断是否前两个主成分的贡献率是否超过75%),并进行可视化,研究可分性准则数据。%方法包括:最小距离法(均值点)、k近邻法(k取1、3、5)等%从错误率角度分析,6种组合中哪种最好?与基于可分性准则函数J值的判断是否一致%可以考虑把过去的作业程序进行优化,构成函数,争取有所进步%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 清空环境变量clc;clear;close all;%% 数据提取与处理load data.csv;c1(1:50,:)=data(1:50,:);%第1类样本存入c1(50个,包括第5列的标签1)c2(1:50,:)=data(51:100,:); %第2类样本存入c2(50个,包括第5列的标签1)c3(1:50,:)=data(101:150,:); %第3类样本存入c3(50个,包括第5列的标签1)c=[c1';c2';c3']; %数据转置合并处理cT=c'; %得出转置的变量train=data([1:40,51:90,101:140],[1:4])'; %得到4*120个纯训练样本集合train_c1=data(1:40,:); %得到40个带有标签的第一类训练数据train_c2=data(51:90,:);%得到40个带有标签的第二类训练数据train_c3=data(101:140,:); %得到40个带有标签的第三类训练数据test_c1=data(41:50,:); %得到10个带有标签的第一类测试数据test_c2=data(91:100,:);%得到10个带有标签的第二类测试数据test_c3=data(141:150,:); %得到10个带有标签的第三类测试数据%% 计算J值,调用子函数J = zeros(4,4);for i=1:4%希望得到一个4*4的J数据(行列组合代表这对组合的J值)for j=1:4if i==j%如果i=j代表取的两类特征相同,必须取两类不同,于是跳出,进行下一次循环J取0J(i,j)=0;elselanda_1=cT(1:40,[i,j]);landa_2=cT(1:40,[i+5,j+5]);landa_3=cT(1:40,[i+10,j+10]);[J(i,j),Sw,Sb] = cal_J(landa_1,landa_2,landa_3);endendenddisp(J);%% PCA算法对样本优化降维train_A = PCA(train);%调用子函数实现PCA算法优化%% 画出不同特征类型下三类Iris分布for i=1:4for j=1:4if i==jbreak;elsefigure(i+10*j); hold on;%保存图片的编号(ij)plot(c1(:,i),c1(:,j),'g*'); hold on; %画出第一类样本plot(c2(:,i),c2(:,j),'bo'); hold on; %画出第二类样本plot(c3(:,i),c3(:,j),'r+'); hold on; %画出第三类样本legend('第一类样本','第二类样本','第三类样本'); hold on;axis equal; %平均坐标grid on;endendend%% 最小距离法error_dmin = dmin(train_c1,train_c2,train_c3,test_c1,test_c2,test_c3); %调用最小距离法子函数dmin;error_dmin_rate = error_dmin/30;%% k近邻法(k取1,3,5)error_knn = KNN(train_c1,train_c2,train_c3,test_c1,test_c2,test_c3,cT,data); %调用k近邻法子函数KNN;

子函数cal_J

function [J,Sw,Sb] = cal_J(landa_1,landa_2,landa_3)%sample为三类样本的特征矩阵,即主函数中的landa_1,landa_2.landa_3[x1 y1] = size(landa_1);[x2 y2] = size(landa_2);[x3 y3] = size(landa_3);landa_1mean = mean(landa_1);landa_2mean = mean(landa_2);landa_3mean = mean(landa_3);all_mean = mean([landa_1;landa_2;landa_3]);Sw = 0;%类内离散度Sb = 0; %类间离散度for i = 1: x1Sw = Sw + (landa_1(i,:)-landa_1mean)*(landa_1(i,:)-landa_1mean)';endfor i = 1: x2Sw = Sw + (landa_2(i,:)-landa_2mean)*(landa_2(i,:)-landa_2mean)';endfor i = 1: x3Sw = Sw + (landa_3(i,:)-landa_3mean)*(landa_3(i,:)-landa_3mean)';end Sb = Sb + x1*(landa_1mean - all_mean)*(landa_1mean - all_mean)';Sb = Sb + x2*(landa_2mean - all_mean)*(landa_2mean - all_mean)';Sb = Sb + x3*(landa_3mean - all_mean)*(landa_3mean - all_mean)';J = Sb/Sw; %准则函数JEnd

子函数PCA

function train_A = PCA(train)%PCA 函数实现训练样本从4维压缩为2维最典型特征的过程%% 原始数据准备[m_train,i_train]=size(train); %train是原始数据4*120,m表示维数,i表示列数%% 第一步算总体均值并平移坐标mean_train = mean(train')'; %算出总体均值for i=1:i_traintrain(:,i)=train(:,i)-mean_train; %每个列向量减去均值end%% 求自相关阵R = zeros(m_train);for i=1:i_trainR = R + train(:,i)*train(:,i)';%每列乘自身转置累加endR = R/i_train; %除列数取平均%% 求特征值与特征向量[V,D] = eig(R);%eig函数就是对矩阵很方便求取特征值D和特征向量V的函数%% 取最大的特征值对应的特征向量作变换矩阵AA = V(:,[3,4]); %取最后两列就是最大的特征向量,因为eig默认有小到大排[z,index]=sort(mean(D)); %取出最大的D是哪几个,放入标签index中z_sum=sum(z(1,:));if (z(1,3)+z(1,4))/z_sum>=0.75 %判断两个主成分贡献率是否超过0.75fprintf('两个主成分贡献率超过0.75\n');end%% 算出降维后的trian_Atrain_A = A'*train;%算出来的train_A是经过降维后2*120的训练样本%% 画出降维后的train_A中的三类样本plot(train_A(1,1:40),train_A(2,1:40),'g*'); hold on; %第一类画绿*plot(train_A(1,41:80),train_A(2,41:80),'bo'); hold on;%第二类画蓝o plot(train_A(1,81:120),train_A(2,81:120),'r+'); hold on;%第三类画红+ legend('第一类样本','第二类样本','第三类样本');grid on;axis equal;%画网格线,平均坐标长短%% 计算样本提取后的J值landa_1 = train_A(1:2,1:40)';landa_2 = train_A(1:2,41:80)';landa_3 = train_A(1:2,81:120)';[J_PCA, Sw_PCA, Sb_PCA] = cal_J(landa_1,landa_2,landa_3);disp(J_PCA);disp(Sw_PCA);disp(Sb_PCA);end

子函数dmin

function error_dmin = dmin(train_c1,train_c2,train_c3,test_c1,test_c2,test_c3)%该函数功能是实现最小距离法分类%% 训练3类花的样本中心点train_p1=mean(train_c1); %算出第一类训练样本的类中心train_p2=mean(train_c2);train_p3=mean(train_c3);%% 测试3类花的样本中心点for i=1:4for j=1:4error_dmin(i,j) = 0;if i==jbreak;else%测试样本,并输出错误个数;for ii=1:10d1=sqrt((test_c1(ii,i)-train_p1(1,i))^2 + (test_c1(ii,j)-train_p1(1,j))^2);d2=sqrt((test_c1(ii,i)-train_p2(1,i))^2 + (test_c1(ii,j)-train_p2(1,j))^2);d3=sqrt((test_c1(ii,i)-train_p3(1,i))^2 + (test_c1(ii,j)-train_p3(1,j))^2);if d1<d3 && d1<d2error_dmin(i,j)=error_dmin(i,j);else error_dmin(i,j)=error_dmin(i,j)+1;endendfor ii=1:10d1=sqrt((test_c2(ii,i)-train_p1(1,i))^2 + (test_c2(ii,j)-train_p1(1,j))^2);d2=sqrt((test_c2(ii,i)-train_p2(1,i))^2 + (test_c2(ii,j)-train_p2(1,j))^2);d3=sqrt((test_c2(ii,i)-train_p3(1,i))^2 + (test_c2(ii,j)-train_p3(1,j))^2);if d2<d3 && d2<d3error_dmin(i,j)=error_dmin(i,j);else error_dmin(i,j)=error_dmin(i,j)+1;endendfor ii=1:10d1=sqrt((test_c3(ii,i)-train_p1(1,i))^2 + (test_c3(ii,j)-train_p1(1,j))^2);d2=sqrt((test_c3(ii,i)-train_p2(1,i))^2 + (test_c3(ii,j)-train_p2(1,j))^2);d3=sqrt((test_c3(ii,i)-train_p3(1,i))^2 + (test_c3(ii,j)-train_p3(1,j))^2);if d3<d1 && d3<d2error_dmin(i,j)=error_dmin(i,j);else error_dmin(i,j)=error_dmin(i,j)+1;endendendendend%% 输出不同类别错误点数disp(error_dmin)end

子函数KNN

function error_knn = KNN(train_c1,train_c2,train_c3,test_c1,test_c2,test_c3,cT,data)%KNN 该函数功能是实现最近邻法分类(k取得1,3,5)%% 训练样本for k=1:2:5error_knn = zeros(4,4);for i=1:4 %把i,j看做取的两个特征标签for j=1:4error_knn(i,j) = 0;if i==j break;elselanda_train=cT(1:40,[i,j,i+5,j+5,i+10,j+10]);for ii=1:10%把ii看做测试样本1-10个进行循环。3类的10个样本同时进行for jj=1:40%把jj看做训练样本1-40个循环计算,3类同时进行120个计算,分别存入不同的d中d1(jj)=sqrt((test_c1(ii,i)-landa_train(jj,1))^2+(test_c1(ii,j)-landa_train(jj,2))^2);d1(jj+40)=sqrt((test_c1(ii,i)-landa_train(jj,3))^2+(test_c1(ii,j)-landa_train(jj,4))^2);d1(jj+80)=sqrt((test_c1(ii,i)-landa_train(jj,5))^2+(test_c1(ii,j)-landa_train(jj,6))^2);[m1,n1]=sort(d1);d2(jj)=sqrt((test_c2(ii,i)-landa_train(jj,1))^2+(test_c2(ii,j)-landa_train(jj,2))^2);d2(jj+40)=sqrt((test_c2(ii,i)-landa_train(jj,3))^2+(test_c2(ii,j)-landa_train(jj,4))^2);d2(jj+80)=sqrt((test_c2(ii,i)-landa_train(jj,5))^2+(test_c2(ii,j)-landa_train(jj,6))^2);[m2,n2]=sort(d2);d3(jj)=sqrt((test_c3(ii,i)-landa_train(jj,1))^2+(test_c3(ii,j)-landa_train(jj,2))^2);d3(jj+40)=sqrt((test_c3(ii,i)-landa_train(jj,3))^2+(test_c3(ii,j)-landa_train(jj,4))^2);d3(jj+80)=sqrt((test_c3(ii,i)-landa_train(jj,5))^2+(test_c3(ii,j)-landa_train(jj,6))^2);[m3,n3]=sort(d3);endx11=0;x21=0;x31=0; %x_1第1类测试花的第1,2,3种可能性投票;x12=0;x22=0;x32=0; %x_2第2类测试花的第1,2,3种可能性投票;x13=0;x23=0;x33=0; %x_3第3类测试花的第1,2,3种可能性投票;for s=1:k %计算k次,并计算得票总数;Judge1=n1(s);Judge2=n2(s);Judge3=n3(s);if Judge1<=40 x11=x11+1;elseif Judge1<=80 x21=x21+1;elsex31=x31+1;endif Judge2<=40 x12=x12+1;elseif Judge2<=80 x22=x22+1;elsex32=x32+1;endif Judge3<=40 x13=x13+1;elseif Judge3<=80 x23=x23+1;elsex33=x33+1;endendif x11>=x21 && x11>=x31error_knn(i,j) = error_knn(i,j);elseerror_knn(i,j) = error_knn(i,j)+1;endif x22>=x12 && x22>=x32error_knn(i,j) = error_knn(i,j);elseerror_knn(i,j) = error_knn(i,j)+1;endif x33>=x13 && x33>=x23error_knn(i,j) = error_knn(i,j);elseerror_knn(i,j) = error_knn(i,j)+1;endend end endenddisp(error_knn);endend

如果觉得《针对IRIS数据的特征选择与提取方法研究(模式识别第四次作业)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。