%构造两类二维近似线性可分的样本数据集合w1和w2
w1=rand(15,2)*20;
w2=rand(18,2)*20+15;
figure;
plot(w1(:,1),w1(:,2),'g+');
hold on;
plot(w2(:,1),w2(:,2),'bo');
xlabel('x(1)');
ylabel('x(2)');
title('Fisher准则分类');
%调用fisher判别函数,返回最优投影方向w和分界阈值点y0
[w,y0]=fisher1(w1,w2);
%作图:两类样本在最优投影方向上的投影
o1=(w*(w'*w1'))'; %第一类的样本向量在最优方向w上的投影
for i=1:length(o1)
h=line([o1(i,1),w1(i,1)],[o1(i,2),w1(i,2)]);
set(h,'Color','g','LineStyle','--')
end
o2=(w*(w'*w2'))'; %第二类的样本向量在最优方向w上的投影
for i=1:length(o2)
h=line([o2(i,1),w2(i,1)],[o2(i,2),w2(i,2)]);
set(h,'Color','b','LineStyle','--')
end
th=(w*y0)';
plot(th(1),th(2),'rx','LineWidth',2,'MarkerSize',8)
axis tight
axis equal
h=gca;
XLim=get(h,'XLim');
YLim=get(h,'YLim');
l=(w*(w'*[XLim(1),YLim(1)]'))';
r=(w*(w'*[XLim(2),YLim(2)]'))';
h=line([l(1),r(1)],[l(2),r(2)]);
set(h,'color','k')
函数fisher1.m的程序清单:
function [w,y0]=fisher1(w1,w2)
%两类问题的Fisher线性判别
training=[w1;w2];
group=[ones(length(w1),1);ones(length(w2),1)*2];
[row,col]=size(training); %row表示样本数; col表示特征数
sum=zeros(col,1,2);
count=zeros(1,2);
m=zeros(col,1,2);
S=zeros(col,col,2);
for i=1:row
if group(i)==1
sum(:,1,1)=sum(:,1,1)+training(i,:)';
count(1,1)=count(1,1)+1;
elseif group(i)==2
sum(:,1,2)=sum(:,1,2)+training(i,:)';
count(1,2)=count(1,2)+1;
end
end
%计算d维空间的两类样本的均值向量。
m(:,1,1)=sum(:,1,1)/count(1,1);
m(:,1,2)=sum(:,1,2)/count(1,2);
for i=1:row
if group(i)==1
S(:,:,1)=S(:,:,1)+(training(i,:)'-m(:,1,1))*(training(i,:)'-m(:,1,1))';
elseif group(i)==2
S(:,:,2)=S(:,:,2)+(training(i,:)'-m(:,1,2))*(training(i,:)'-m(:,1,2))';
end
end
%计算样本总类内离散度矩阵
Sw=S(:,:,1)+S(:,:,2);
%计算样本类间离散度矩阵
Sb=(m(:,1,1)-m(:,1,2))*(m(:,1,1)-m(:,1,2))';
w=inv(Sw)*(m(:,1,1)-m(:,1,2));
w=w/norm(w);
y=(w'*training')';
sum1=0;sum2=0;
for i=1:row
if group(i)==1
sum1=sum1+y(i);
elseif group(i)==2
sum2=sum2+y(i);
end
end
%计算投影到一维空间的两类样本的均值
m1=sum1/count(1,1);
m2=sum2/count(1,2);
%利用先验知识选定分界阈值点y0
y0=(count(1,1)*m1+count(1,2)*m2)/(count(1,1)+count(1,2));