Fisher分类器设计
班级:自092 姓名:刘昌元学号:099064370 一、实验目的:
1:根据fisher准则设计线性分类器
2:由fisher分类器训练样本数据
3:由fisher分类器测试样本观察出错率并与贝叶斯分类器的出错率比较判断两种分类器的性能优劣
4:将测试数据和决策面画在一张图上直观显示
是
三、实验所用函数:
类均值向量:∑=∈i
xj j i x N M χ1
类内离散度矩阵:T
i j i i
xj j i
M x M x S ))((--∑∈=χ
总类内离散度矩阵:21S S S w +=
类间离散度矩阵:T b M M M M S ))((2121--= 最有投影方向:)(211
*
M M S W w -=-
决策函数:0)
(w x w x G T +=
阈值:)(2
1210M w M w w T T
+-= 四、实验结果:
1:得到参数:最有投影向量和阈值
2:利用分类器输入身高和体重数据得到性别分类(实验结果如下)
w=[ 0.0012; 0.0003] threshold =0.2318
classify(165,56) 结果为“女” classify(178,70) 结果为“男”3:fisher准则分类器的出错率统计:
测试test1:
实际个数分类个数出错率
男生84.0000 31.0000 0.6310
女生40.0000 93.0000 1.3250
测试test2:
4:bayes分类器测试出错统计:
测试test1:
测试test2:
结论:很显然bayes分类器比fisher分类器准确率高的多。
4:分类面决策图:
五、程序:
程序1:求最有投影方向和阈值
%程序功能:应用fisher分类方法,使用训练数据获得阈值和最佳变换向量(投影方向)% function fisher(boys,girls) %调用男生和女生的训练样本数据%
A=boys.';
B=girls.';
[k1,l1]=size(A);
[k2,l2]=size(B);
M1=sum(boys);
M1=M1.';
M1=M1/l1; %求男生身高与体重的均值%
M2=sum(girls);
M2=M2.';
M2=M2/l2; %求女生身高与体重的均值%
S1=zeros(k1,k1);
S2=zeros(k2,k2);
for i=1:l1
S1=S1+(A(:,i)-M1)*((A(:,i)-M1).'); %求类内离散度矩阵S1%
end
for i=1:l2
S2=S2+(B(:,i)-M2)*((B(:,i)-M2).'); %求类内离散度矩阵S2%
end
for i=1:2
for j=1:2
Sw(i,j)=S1(i,j)+S2(i,j); %求总类内离散度矩阵Sw%
end
end
w=inv(Sw)*(M1-M2) %求最有投影方向%
wT=w.';
for i=1:l1
Y1(i)=wT(1,1)*A(1,i)+wT(1,2)*A(2,i); %由分类函数g(x)=wT*x求男生身高和体重的阈值%
end
for i=1:l2
Y2(i)=wT(1,1)*B(1,i)+wT(1,2)*B(2,i); %由分类函数g(x)=wT*x求女生身高和体重的阈值%
end
m1=sum(Y1)/l1; %阈值平均%
m2=sum(Y2)/l2; %阈值平均%
threshold=(l1*m1+l2*m2)/(l1+l2) %求fisher决策面的阈值%
程序2:构成fisher判别器
%函数功能:应用Fisher准则构成的分类器判断一个身高体重二维数据的性别
%函数使用方法:输入classify(hight,weight)其中hight和weight分别是身高和体重的数据
function value=classify(hight,weight)
w=[0.0012;0.0003];
threshold=0.2318;
tem=[hight;weight]; %将输入的身高和体重数据构成列向量%
result=(w.')*tem; %根据fisher判别式求判别值%
if result>threshold %判别值和决策面阈值比较%
value=1;
else
value=0;
end
程序3:
%功能:调用Fisher分类器统计出错率
%开发者:安徽工业大学自动化092班刘昌元function result=Error(file)
[m,n]=size(file);
Boy=0;
Girl=0;
boy=0;
girl=0;
for i=1:m
if(file(i,3)==0)
Girl=Girl+1;
else
Boy=Boy+1;
end
A(i,1)=file(i,1);
A(i,2)=file(i,2);
end
w=[0.0012;0.0003];
threshold =0.2318;
for i=1:m
classify(A(i,1),A(i,2));
if(ans==0)
girl=girl+1;
else
boy=boy+1;
end
end
tem1=abs(Boy-boy)/Boy;
tem2=abs(Girl-girl)/Girl;
result(1,1)=Boy;
result(1,2)=boy;
result(1,3)=tem1;
result(2,1)=Girl;
result(2,2)=girl;
result(2,3)=tem2;
程序4:
%程序:画图
%功能:将训练样本boy.txt和girl.txt中的数据和线性决策面以及贝叶斯决策面画到一幅图上function graphics(boys,girls)
w=[0.0012;0.0003];
threshold =0.2318;
A=boys.';
B=girls.';
[m1,n1]=size(A);
[m2,n2]=size(B);
for i=1:n1
x=A(1,i);
y=A(2,i);
plot(x,y,'R.');
hold on
end
for i=1:n2
x=B(1,i);
y=B(2,i);
plot(x,y,'G.');
hold on
end
a1=min(A(1,:));
a2=max(A(1,:));
b1=min(B(1,:));
b2=max(B(1,:));
a3=min(A(2,:));
a4=max(A(2,:));
b3=min(B(2,:));
b4=max(B(2,:));
if a1<b1
a=a1;
else
a=b1;
end
if a2>b2
b=a2;
else
b=b2;
end
if a3<b3
c=a3;
else
c=b3;
end
if a4>b4。