2.Fisher准则
下面表样本数据中的类别ω1 和ω2 计算最优方向 W。画出最优方向 W的直线,并标记出投影后的点在直线上的位置。
【源程序:】
function fisher %w1中数据点的坐标
x1 =[-0.4 -0.31 -0.38 -0.15 -0.35 0.17 -0.011 -0.27 -0.065 -0.12]; x2 =[0.58 0.27 0.055 0.53 0.47 0.69 0.55 0.61 0.49 0.054];
x3 =[0.089 -0.04 -0.035 0011 0.034 0.1 -0.18 0.12 0.0012 -0.063];
%将x1、x2、x3变为行向量 x1=x1(:); x2=x2(:); x3=x3(:);
%计算第一类的样本均值向量m1 m1(1)=mean(x1); m1(2)=mean(x2); m1(3)=mean(x3);
%计算第一类样本类内离散度矩阵S1 S1=zeros(3,3); for i=1:10
S1=S1+[-m1(1)+x1(i) -m1(2)+x2(i) -m1(3)+x3(i)]'*[-m1(1)+x1(i) -m1(2)+x2(i) -m1(3)+x3(i)]; end
%w2的数据点坐标
x4 =[0.83 1.1 -0.44 0.047 0.28 -0.39 0.34 -0.3 1.1 0.18]; x5 =[1.6 1.6 -0.41 -0.45 0.35 -0.48 -0.079 -0.22 1.2 -0.11]; x6 =[-0.014 0.48 0.32 1.4 3.1 0.11 0.14 2.2 -0.46 -0.49];
6
x4=x4(:); x5=x5(:); x6=x6(:);
%计算第二类的样本均值向量m2 m2(1)=mean(x4); m2(2)=mean(x5); m2(3)=mean(x6);
%计算第二类样本类内离散度矩阵S2 S2=zeros(3,3); for i=1:10
S2=S2+[-m2(1)+x4(i) -m2(2)+x5(i) -m2(3)+x6(i)]'*[-m2(1)+x4(i) -m2(2)+x5(i) -m2(3)+x6(i)]; end
%总类内离散度矩阵Sw Sw=zeros(3,3); Sw=S1+S2;
%样本类间离散度矩阵Sb Sb=zeros(3,3);
Sb=(m1-m2)'*(m1-m2); %最优解W
W=Sw^-1*(m1-m2)'
%将W变为单位向量以方便计算投影 W=W/sqrt(sum(W.^2));
%计算一维Y空间中的各类样本均值M1及M2 for i=1:10
y(i)=W'*[x1(i) x2(i) x3(i)]'; end
M1=mean(y) for i=1:10
y(i)=W'*[x4(i) x5(i) x6(i)]'; end
M2=mean(y)
%利用当P(w1)与P(w2)已知时的公式计算W0 p1=0.6;p2=0.4;
W0=-(M1+M2)/2+(log(p2/p1))/(10+10-2); %计算将样本投影到最佳方向上以后的新坐标 X1=[x1*W(1)+x2*W(2)+x3*W(3)]';
X2=[x4*W(1)+x5*W(2)+x6*W(3)]';%得到投影长度 XX1=[-0.7,0.58,0.089];
XX2=[0.047,-0.4,1.04];%得到新坐标 %绘制样本点 figure(1)
7
plot3(x1,x2,x3,'r*') %第一类 hold on
plot3(x4,x5,x6,'bp') %第二类 legend('第一类点','第二类点') title('Fisher线性判别曲线') W1=5*W;
%画出最佳方向
line([-W1(1),W1(1)],[-W1(2),W1(2)],[-W1(3),W1(3)],'color','b'); %判别已给点的分类
a1=[1,1.5,0.6]';a2=[1.2,1.0,0.55]';a3=[2.0,0.9,0.68]';a4=[1.2,1.5,0.89]';a5=[0.23,2.33,1.43]'; A=[a1 a2 a3 a4 a5]
n=size(A,2); %下面代码在改变样本时都不必修改
%绘制待测数据投影到最佳方向上的点 for k=1:n A1=A(:,k)'*W;
A11=W*A1;%得到待测数据投影
y=W'*A(:,k)+W0;%计算后与0相比以判断类别,大于0为第一类,小于0为第二类 if y>0
plot3(A(1,k),A(2,k),A(3,k),'go'); %点为\对应第一类 plot3(A11(1),A11(2),A11(3),'go'); %投影为\对应go类 else
plot3(A(1,k),A(2,k),A(3,k),'m+'); %点为\对应m+类 plot3(A11(1),A11(2),A11(3),'m+'); %投影为\对应m+类 end end
%画出最佳方向
line([-W1(1),W1(1)],[-W1(2),W1(2)],[-W1(3),W1(3)],'color','k'); view([-37.5,30]);
axis([-2,3,-1,3,-0.5,1.5]); grid on hold off
【实验结果:】
8
【实验分析】
W的比例因子对于Fisher判别函数没有影响的原因:
在本实验中,最需要是在此方向上数据的投影,那么W的比例因子,即它是单位向量的多少倍长就无关紧要了。
9