数学建模之Fisher判别

     理论,编程步骤和优缺点

1.理论
判别分析是用于判别个体所属群体的一种统计方法,判别分析的特点是根据已掌握的、历史上每个类别的若干样本的数据信息,总结出客观事物分类的规律性,建立判别公式和判别准则。然后,当遇到新的样本点时,只要根据总结出来的判别公式和判别准则,就能判别该样本点所属的类别。判别分析是一种应用性很强的统计数据分析方法。

Fisher判别
(1)借助方差分析的思想构造一个线性判别函数:
(2)确定判别函数系数时要求使得总体之间区别最大,而使每个总体内部的离差最小。
(3)从几何的角度看,判别函数就是p维向量X在某种方向上的投影。使得变换后的数据同类别的点“尽可能聚在一起”,不同类别的点“尽可能分离”,以此达到分类的目的。
两类Fisher判别示意图

(1)如果有多个类别, Fisher判别可能需要两个或者更多的判别函数才能完成分类。
(2)一般来说判别函数的个数等于分类的个数减一。
(3)得到判别函数后,计算待判样品的判别函数值,根据判别函数的值计算待判样品到各类的重心的距离,从而完成分类。
2.编程步骤

① 把来自两类的训练样本集分成和两个子集和。
② 由,,计算。
③ 由计算各类的类内离散度矩阵,。
④ 计算类内总离散度矩阵。
⑤ 计算的逆矩阵。
⑥ 由求解。
3.优点
(1)一般对于线性可分的样本,总能找到一个投影方向,使得降维后的样本仍然线性可分,而且可分性更好即不同类别的样本之间的距离竟可能的远,同一类别的尽可能的集中分布。
(2)Fisher方法可以直接求解法向量。
(3)Fisher的线性判别不仅适用于确定性的模式分类器的训练,而且对于随机的模机也是适用的,Fisher还可以推广到多类问题中去。
缺点
(1)如果M1=M2,W=0.则这样的样本线性不可分;M1!=M2,未必线性可分;SW不可逆,未必不可分。
(2)对于线性不可分的情况,Fisher方法无法确定分类。
程序如下:

clear% w1类训练样本,10组,每组为行向量。
w1=[-0.4,0.58,0.089;-0.31,0.27,-0.04;-0.38,0.055,-0.035;-0.15,0.53,0.011;-0.35,0.47,0.034;0.17,0.69,0.1;-0.011,0.55,-0.18;-0.27,0.61,0.12;-0.065,0.49,0.0012;-0.12,0.054,-0.063]; 
% w2类训练样本,10组,每组为行向量。
w2=[0.83,1.6,-0.014;1.1,1.6,0.48;-0.44,-0.41,0.32;0.047,-0.45,1.4;0.28,0.35,3.1;-0.39,-0.48,0.11;0.34,-0.079,0.14;-0.3,-0.22,2.2;1.1,1.2,-0.46;0.18,-0.11,-0.49]; 
%w1=load('xxx1.txt');
%w2=load('xxx2.txt');
xx1=[-0.7,0.58,0.089]';  
%测试数据xx1,为列向量。
xx2=[0.047,-0.4,1.04]';  
%测试数据xx2,为列向量。
m1=mean(w1,1)';  
% w1类样本均值向量,为列向量
sw1=cov(w1,1);   
% w1类样本类内离散度矩阵
m2=mean(w2,1)';  
% w2类样本均值向量,为列向量
sw2=cov(w2,1);   
% w2类样本类内离散度矩阵
sw=sw1+sw2;      
%总类内离散度矩阵
w= inv(sw)*(m1-m2);  
%投影方向
y0=(w'*m1+w'*m2)/2;  
%阈值y0
figure(1) 
for i=1:10  
    plot3(w1(i,1),w1(i,2),w1(i,3),'g+') 
    hold on
    plot3(w2(i,1),w2(i,2),w2(i,3),'ro') 
end
xlabel('x轴'); 
ylabel('y');  
title('原始训练数据w1,w2三维分布图'); 
z1=w'*w1'; 
z2=w'*w2'; 
figure(2) 
for i=1:10  
    plot3(z1(i)*w(1),z1(i)*w(2),z1(i)*w(3),'g+') 
    hold on
    plot3(z2(i)*w(1),z2(i)*w(2),z2(i)*w(3),'ro')  
end
xlabel('x轴'); 
ylabel('y轴');  
title('训练数据w1,w2线性分类效果图'); 
hold off
y1=w'*xx1; 
if y1>y0  
   fprintf('测试数据xx1属于w1类\n'); 
else
   fprintf('测试数据xx1属于w2类\n'); 
end
y2=w'*xx2; 
if y2>y0  
   fprintf('测试数xx2属于w1类\n'); 
else
   fprintf('测试数据xx2属于w2类\n'); 
end

clear   
% w1类训练样本,10组,每组为行向量。

w1=[-0.4,0.58,0.089;-0.31,0.27,-0.04;-0.38,0.055,-0.035;-0.15,0.53,0.011;-0.35,0.47,0.034;0.17,0.69,0.1;-0.011,0.55,0.18;-0.27,0.61,0.12;-0.065,0.49,0.0012;-0.12,0.054,-0.063]; 

% w2类训练样本,10组,每组为行向量。
w2=[0.83,1.6,-0.014;1.1,1.6,0.48;-0.44,-0.41,0.32;0.047,-0.45,1.4;0.28,0.35,3.1; -0.39,-0.48,0.11;0.34,-0.079,0.14;-0.3,-0.22,2.2;1.1,1.2,-0.46;0.18,-0.11,-0.49]; 
% w3为待分类样本数据,10组,每组为列向量。
w3=[1.58,2.32,-5.8;0.67,1.58,-4.78;1.04,1.01,-3.63;-1.49,2.18,-3.39;-0.41,1.21,-4.73;1.39,3.61,2.87;1.2,1.4,-1.89;-0.92,1.44,-3.22;0.45,1.33,-4.38;-0.76,0.84,-1.96]'; 
m1=mean(w1,1)';  
% w1类样本均值向量,为列向量
sw1=cov(w1,1);   
% w1类样本类内离散度矩阵
m2=mean(w2,1)';  
% w2类样本均值向量,为列向量
sw2=cov(w2,1);   
% w2类样本类内离散度矩阵
sw=sw1+sw2;      
%总类内离散度矩阵
w= inv(sw)*(m1-m2);  
%投影方向
y0=(w'*m1+w'*m2)/2  
%阈值y0
% w1,w2,w3原始数据三维分布图
figure(3) 
for i=1:10  
    plot3(w1(i,1),w1(i,2),w1(i,3),'g+') 
    hold on
    plot3(w2(i,1),w2(i,2),w2(i,3),'ro') 
    hold on
    plot3(w3(1,i),w3(2,i),w3(3,i),'bp') 
end
xlabel('x轴'); 
ylabel('y轴');  
title('训练w1,w2/样本w3原始数据三维分布图');

 
% w1,w2,w3数据线性投影分类效果图
z1=w'*w1'; 
z2=w'*w2'; 
z3=w'*w3; 
figure(4) 
for i=1:10  
    plot3(z1(i)*w(1),z1(i)*w(2),z1(i)*w(3),'g+') 
    hold on
    plot3(z2(i)*w(1),z2(i)*w(2),z2(i)*w(3),'ro') 
    hold on
    plot3(z3(i)*w(1),z3(i)*w(2),z3(i)*w(3),'bp') 
end
xlabel('x轴'); 
ylabel('y轴');  
title('训练w1,w2/样本w3数据线性投影分类效果图'); 
hold off
for i=1:10  
    y(i)=w'*w3(:,i); 
      if  y(i)>y0  
          fprintf('样本数据%d属于w1类\n',i); 
      else
          fprintf('样本数据%d属于w2类\n',i);
      end
end



你可能感兴趣的:(数学建模)