一、实验内容
已知有两类数据和,即 Female.txt和Male.txt,进行Fisher判别分类,用test1.txt和test1.txt中的样本进行测试。
二、实验要求
把数据作为样本,根据Fisher选择投影方向的原则,使原样本向量在该方向上的投影能兼顾类间分布尽可能分开,类内样本投影尽可能密集的要求,求出评价投影方向的函数,并在图形表示出来。并在实验报告中表示出来,并求使取极大值的。用matlab完成Fisher线性分类器的设计,程序的语句要求有注释。
三、实验结果
clc;clear all;
male_data = importdata('D:\Desktop\模式识别\shiyanyi\MALE.TXT');
female_data = importdata('D:\Desktop\模式识别\shiyanyi\FEMALE.TXT');
x1=male_data(:,1);%男生第一列
y1=male_data(:,2);%男生第二列
%disp(x1);
x2=female_data(:,1);
y2=female_data(:,2);
m1 = ones(2,50);%两行五十列 存储男生信息
m2 = ones(2,50);
for i = 1:50
m1(1,i) = x1(i);
m1(2,i) = y1(i);
end
for i = 1:50
m2(1,i) = x2(i);
m2(2,i) = y2(i);
end
%类均值向量M1 M2
M1=[mean([m1]')]'
M2=[mean([m2]')]'
%类内离散度矩阵 S1 S2
S1=zeros(2,2);
for i=1:50 %类内离散度计算
S1=S1+(m1(:,i)-M1)*(m1(:,i)-M1)';
end
S2=zeros(2,2);
for i=1:50
S2=S2+(m2(:,i)-M2)*(m2(:,i)-M2)';
end
%总类内散度矩阵
Sw=zeros(2,2);
Sw=S1+S2;
%样本类间散度矩阵Sb
Sb=zeros(2,2);
Sb=(M1-M2)*(M1-M2)';
%最优解W
W=Sw^-1*(M1-M2)
%将W变为单位向量以方便计算投影
W=W/sqrt(sum(W.^2));
%计算一维Y空间中的各类样本均值m11及m22
m11=W'*M1;
m22=W'*M2;
%计算w0
W0=-1/2*(m11+m22);
X1=[x1*W(1)+y1*W(2)]';
X2=[x2*W(1)+y2*W(2)]';%计算投影得到的长度
XX1=[W(1)*X1;W(2)*X1;];
XX2=[W(1)*X2;W(2)*X2;];%得到新坐标
%绘制样本点
figure(1)
axis([50 200 0 100]);
plot(x1,y1,'r*') %第一类
hold on
axis([50 200 0 100]);
plot(x2,y2,'bp') %第二类
legend('第一类点','第二类点')
title('Fisher线性判别函数')
W1=200*W;
%画出最佳方向
line([-W1(1),W1(1)],[-W1(2),W1(2)],'color','b');