Authord:VividXu;实验三Fisher线性判别实验姓名:徐维坚学号:2220103484日期:2012/7/7一、实验目的:1)加深对Fisher线性判别的基本思想的认识和理解。2)编写实现Fisher线性判别准则函数的程序。二、实验原理:1.基本原理:一般情况下,我们总可以找到某个方向,使得这个方向的直线上,样本的投影能分开的最好,而Fisher法所要解决的基本问题就是找到这条最好的、最易于分类的投影线。先从d维空间到一维空间的一维数学变换方法。假设有一集合X包含N个d维样本Nxxx,...,,21,其中1N个属于1类的样本记为子集1X,2N个属于2类的样本记为2X。若对Nx的分量做线性组合可得标量nTnxwy,iNn,...,2,1这样便得到N个一维样本ny组成的集合,并可分为两个子集1Y和2Y。w的绝对值是无关紧要的,它仅使ny乘上一个比例因子,重要的是选择w的方向,从而转化为寻找最好的投影方向*w,是样本分开。2.基本方法:先定义几个基本参量:(1)各类样本均值向量im2,1,1ixNmiXxi(2)样本类内离散度矩阵iS和总类内离散度矩阵S2,1,))((imxmxSiXxTiii21SSS(3)样本类间离散度矩阵bSTbmmmmS))((2121我们希望投影后,在低维空间里个样本尽可能的分开些,即希望两类均值)(21mm越大越Authord:VividXu;好,同时希望各类样本内部尽量密集,即iS越小越好。因此,我们定义Fisher准则函数为21221)()(SSmmwJF但)(wJF不显含w,因此必须设法将)(wJF变成w的显函数。由式子iTXxiTXxTiYyiimwxNwxwNyNmiii)1(11wSwwmmmmwmwmwmmbTTTTT))(()()(2121221221wSwwmxmxwmwxwmySiTTiiTYyiTTYyiiii))(()()(22从而得到wSwwSwwJTbTF)(,采用Lagrange乘子法求解它的极大值*w)(),(cwSwwSwwLTbT对其求偏导,得0**wSwSb,即**wSwSb从而我们很容易得到*21211*1*)(,)()(wmmRRmmSwSSwTb其中)(211*mmSRw忽略比例因子/R,得)(211*mmSw这就是我们Fisher准则函数)(wJF取极大值时的解。三、实验内容:依据实验基本原理和基本方法,对下面表3-1样本数据中的类别1和2计算最优方向w,画出最优方向w的直线,并标记出投影后的点在直线上的位置。选择决策边界,实现新样本xx1=(-0.7,0.58,0.089),xx2=(0.047,-0.4,1.04)的分类。设某新类别3数据如表3-2所示,用自己的函数求新类别3分别和1、2分类的投Authord:VividXu;影方向和分类阀值。表3-1Fisher线性判别实验数据类别123456789101x1-0.4-0.31-0.38-0.15-0.350.17-0.011-0.27-0.065-0.12x20.580.270.0550.530.470.690.550.610.490.054x30.089-0.04-0.0350.0110.0340.1-0.180.120.0012-0.0632x10.831.1-0.440.0470.28-0.390.34-0.31.10.18x21.61.6-0.41-0.450.35-0.48-0.079-0.221.2-0.11x3-0.0140.480.321.43.10.110.142.2-0.46-0.49表3-2新类别实验数据类别123456789103x11.580.671.04-1.49-0.411.391.2-0.920.45-0.76x22.321.581.012.181.213.611.41.441.330.84x3-5.8-4.78-3.63-3.39-4.732.87-1.89-3.22-4.38-1.96四、实验程序及其说明:1)Fisher准则函数算法:其中w为我们要找到的投影方向*w,w1、w2是我们的样本1、2,s1、s2是相应样本的类内离散度矩阵iS,sw是总类内离散度矩阵S,m1、m2是相应样本均值。在进行3分别和1、2分类的投影方向和分类阀值时,将对应的s1、s2;sw;m1、m2以及输出坐标换成相应的样本符号。由于代码除此之外均相同,没有必要再重复列出,只需在运行时修改上述值即可。注意:在画出w时(即*w),由于样本的不同,输出系数应作相应的调整。如:1、2时,plot3(30*x,30*x*w(2,:)/w(1,:),30*x*w(3,:)/w(1,:),'k');1、3时,plot3(x,x*w(2,:)/w(1,:),x*w(3,:)/w(1,:),'k');2、3时,plot3(5*x,5*x*w(2,:)/w(1,:),5*x*w(3,:)/w(1,:),'k');代码:clear;w1=[-0.40.580.089;-0.310.27-0.04;-0.380.055-0.035;-0.150.530.011;-0.350.470.034;-0.170.690.1;-0.0110.55-0.18;-0.270.610.12;-0.0650.490.0012;-0.120.054-0.063];w2=[0.81.6-0.014;1.11.60.48;-0.44-0.410.32;0.047-0.451.4;0.280.353.1;-0.39-0.480.11;0.34-0.0790.14;-0.3-0.222.2;1.11.2-0.46;0.18-0.11-0.49];w3=[1.582.32-5.8;0.671.58-4.78;1.041.01-3.63;-1.492.18-3.39;-0.411.21-4.73;1.393.612.87;1.21.4-1.89;-0.921.44-3.22;0.451.33-4.38;-0.760.84-1.96];Authord:VividXu;xx1=[-0.70.580.089];xx2=[0.047-0.41.04];s1=cov(w2,1);%样本类间离散度S1m1=mean(w2);%样本均值m1s2=cov(w3,1);%样本类间离散度S2m2=mean(w3);%样本均值m2sw=s1+s2;%总类内离散度Sww=inv(sw)*(m1-m2)';%Fisher准则函数w*h1=figure(1);fori=1:1:10%打印样本plot3(w2(i,1),w2(i,2),w2(i,3),'r*');holdon;plot3(w3(i,1),w3(i,2),w3(i,3),'bo');end;figure(2)%画出fisher判别函数xmin=min(min(w2(:,1)),min(w3(:,1)));xmax=max(max(w2(:,1)),max(w3(:,1)));x=xmin-1:(xmax-xmin)/100:xmax;plot3(5*x,5*x*w(2,:)/w(1,:),5*x*w(3,:)/w(1,:),'k');holdon;%将样本投影到fisher判别函数上y1=w'*w2';%yn=w^*T*xn,n=1,2y2=w'*w3';figure(2)fori=1:1:10plot3(y1(i)*w(1),y1(i)*w(2),y1(i)*w(3),'rx');holdon;plot3(y2(i)*w(1),y2(i)*w(2),y2(i)*w(3),'bp');end;五、实验结果及其说明:1)Fisher线性判别算法输出结果:Authord:VividXu;1.样本1、2实验结果图3-1Authord:VividXu;2.样本1、3实验结果图3-2Authord:VividXu;3.样本2、2实验结果图2-3六、实验小结:试验时阅读课本发现公式很多,中间推导式较复杂,以为会很难写代码。但参考例代码,并结合课本发现所需要的公式就那几个基本参量,以及最终推导出来的*w。为了画出最优方Authord:VividXu;向*w,我想起了高数里讲过三维空间直线000zzyyxx,从而引导我利用此式,画出了*w,如上所示(2、3时,plot3(5*x,5*x*w(2,:)/w(1,:),5*x*w(3,:)/w(1,:),'k');)。特别值得说的是试验中w=inv(sw)*(m1-m2)';后面是(m1-m2)',而不是(m1-m2),从推导式我们可以看出这无关紧要,只不过要将后续矩阵——y1=w'*w2';相应的求其转置,以使得矩阵可以相乘。最终我们可以得到*w,以使得样本X从d维空间投影到一维Y空间。