资源描述
个人收集整理 勿做商业用途
简单的利用Fisher准则函数获取最佳投影线的Matlab程序
发现利用Fisher准则函数计算最佳投影方向的公式好像很简单,就写这个吧!
这个Fisher法就是将高维空间中的样本投影到一维空间中,以降低复杂度。具体可以参见边肇祺、张学工著,清华大学出版社的《模式识别》(第二版)P87。
用这种方法时使用到了几个概念:
样本向量:样本向量是列向量,样本是d维空间中的点,因此它的位置可以用一个d维列向量表示;
各类样本均值向量:一类中所有样本向量的均值,也是d维列向量;
样本类内离散度矩阵:
x为样本向量,mi为Ci类的均值向量,Si为Ci类的类内离散度矩阵。
总类内离散度矩阵:Sw=S1+S2;
利用Lagrange乘子法可以求出使Fisher准则函数取极大值的向量:
这个向量指出了相对于Fisher准则函数最好的投影线方向。
虽然推导出这个结果,破费了些周折,但是结果的形式还是相对比较简单的,所以用Matlab程序实现它应该不麻烦。
最终的这个向量仅与总类内离散度矩阵和各类的均值向量有关,我们可以对类内离散度矩阵的表达式变一下形,使程序更容易写:
这样的变形也许在数学上的意义不大,但是可以简化程序,使得类内离散度矩阵仅用一次矩阵乘法就可完成。
以下程序在Matlab7。0。1下编写。
在编写求解最佳投影线方向的代码之前,先得编写生成样本的函数,如下(为这个函数取名困扰了我很久,最后查字典得知样本是swatch,所以这个函数命名为createSwatch):
function swatch=createSwatch(xmin,xmax,ymin,ymax,num,varargin)
xlen=abs(xmax—xmin);
ylen=abs(ymax—ymin);
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)];
这次的实验是针对2D空间的样本,所以这个createSwatch函数用来产生2D空间的样本点。前四个参数xmin,xmax,ymin,ymax用来设定样本的横纵坐标的范围,第五个参数num用来指定产生的样本的个数,最后有一个可选的参数,用来传入一个函数句柄,用来自定义样本的分布率,默认使用rand,均匀分布.
最后生成的num个样本以矩阵的形式返回,矩阵的一列代表一个样本,矩阵的第一行代表样本的横坐标,第二行代表样本的纵坐标。
然后是计算最佳投影线方向的函数:
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;
%产生两类2D空间的样本
c1=createSwatch(x1min,x1max,y1min,y1max,100);
c2=createSwatch(x2min,x2max,y2min,y2max,80);
%获取最佳投影方向
w=JF(c1,c2);
%计算将样本投影到最佳方向上以后的新坐标
cm1=c1(1,:)*w(1)+c1(2,:)*w(2);
cm2=c2(1,:)*w(1)+c2(2,:)*w(2);
cc1=[w(1)*cm1;w(2)*cm1];
cc2=[w(1)*cm2;w(2)*cm2];
%打开图形窗口
figure;
%绘制多图
hold on;
%绘制第一类的样本
plot(c1(1,:),c1(2,:),'rp’);
%绘制第二类的样本
plot(c2(1,:),c2(2,:),’bp');
%绘制第一类样本投影到最佳方向上的点
plot(cc1(1,:),cc1(2,:),'r+’);
%绘制第二类样本投影到最佳方向上的点
plot(cc2(1,:),cc2(2,:),’b+');
w=10*w;
%画出最佳方向
line([-w(1),w(1)],[-w(2),w(2)],'color’,'k');
axis([—10,10,—10,10]);
grid on;
hold off; 文档为个人收集整理,来源于网络
广告:想在自己的空间中贴上上过色的Matlab代码吗?在《将m文件转化为html文件》 里可以找到将m代码转换成html的Python程序……
通过更改脚本中定义的x1min,x1max,y1min,y1max,x2min,x2max,y2min,y2max这八个参数来设定两类样本的取值范围。
最后画出的图形如下:
红色的五角形是一类样本,蓝色的五角形是另一类样本,红色和蓝色的+是两类样本投影到最佳方向上的情况。黑线就是最佳投影线。
展开阅读全文