当前位置 |首页 > 代写教程 > Matlab教程 >
分享这个代写网站给同学或者朋友吧!

利用Fisher准则函数获取最佳投影线的Matlab程序 

     

  

function swatch=createSwatch(xmin,xmax,ymin,ymax,zmin,zmax,num,varargin)
xlen=abs(xmax-xmin);
ylen=abs(ymax-ymin);

zlen=abs(zmax-zmin);
if numel(varargin)>0 && isa(varargin{1},'function_handle')
    f=varargin{1};
else 
    f=@rand;
end 
swatch=[xlen*f(1,num)+min(xmax,xmin);...
    ylen*f(1,num)+min(ymax,ymin);

zlen*f(1,num)+min(zmax,zmin)];

     

function w=JF(c1,c2)
%利用Fisher准则函数确定最佳投影方向
%c1和c2分别为两类样本的样本矩阵

%得到样本矩阵的尺寸信息
%样本矩阵的行数代表样本的维数
%样本矩阵的列数代表样本的个数
size1=size(c1);
size2=size(c2);
%计算两类样本的均值向量
m1=sum(c1,2)/size1(2);
m2=sum(c2,2)/size2(2);
%样本向量减去均值向量
c1=c1-m1(:,ones(1,size1(2)));
c2=c2-m2(:,ones(1,size2(2)));
%计算各类的类内离散度矩阵
S1=c1*c1.';
S2=c2*c2.';
%计算总类内离散度矩阵
Sw=S1+S2;
%计算最佳投影方向向量
w=Sw^-1*(m1-m2);
%将向量长度变成1
w=w/sqrt(sum(w.^2));

      这个函数有两个参数c1,c2,分别是两个类别的样本矩阵;

      返回值w是一个2维单位列向量,用来指出最佳投影线的方向。

      最后编写一个测试用的脚本:

clear all;
%定义两类样本的空间范围
x1min=2;x1max=6;
y1min=-4,y1max=0;
x2min=6,x2max=10;
y2min=2,y2max=6;

z1min=2,z1max=6;

z2min=-2,z2max=4;
%产生两类2D空间的样本
c1=createSwatch(x1min,x1max,y1min,y1max,z1min,z1max,100); %diao
c2=createSwatch(x2min,x2max,y2min,y2max,z2min,z2max,80);
%获取最佳投影方向
w=JF(c1,c2); %diayongJF
%计算将样本投影到最佳方向上以后的新坐标
cm1=c1(1,:)*w(1)+c1(2,:)*w(2) +c1(3,:)*w(3);
cm2=c2(1,:)*w(1)+c2(2,:)*w(2) +c2(3,:)*w(3);
cc1=[w(1)*cm1;w(2)*cm1;w(3)*cm1];
cc2=[w(1)*cm2;w(2)*cm2;w(3)*cm2];


%打开图形窗口
figure;
%绘制多图
hold on;
%绘制第一类的样本
plot3(c1(1,:),c1(2,:),c1(3,:),'rp');
%绘制第二类的样本
plot3(c2(1,:),c2(2,:),c2(3,:),'bp');
%绘制第一类样本投影到最佳方向上的点
plot3(cc1(1,:),cc1(2,:),cc1(3,:),'r+');
%绘制第二类样本投影到最佳方向上的点
plot3(cc2(1,:),cc2(2,:),cc2(3,:),'b+');
w=10*w;
%画出最佳方向
line([-w(1),w(1),w(1)],[-w(2),w(2),w(2)],'color','k');
axis([-10,10,-10,10,-10,10]);
grid on;
hold off; 

      image.png

 


代写