现在的位置: 首页 > 综合 > 正文

《模式识别原理》实验连载(三)

2012年09月11日 ⁄ 综合 ⁄ 共 1909字 ⁄ 字号 评论关闭

%构造两类二维近似线性可分的样本数据集合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));

抱歉!评论已关闭.