基于 Fisher 准则线性分类器设计实验报告
北京邮电大学模式识别实验专业:×××学生姓名:×××指导教师:×××完成时间:××××
实验二:基于 Fisher 准则线性分类器设计
目录一、实验类型 2 二、实验目的 2 三、实验条件2 四、实验原理2 五、实验内容 4 六、实验要求 7 七、实验结果 71、源代码 72、决策面 113、参数 11 决策面向量 11 阈值 11 样本点分类 11 八、实验分析 131、比例因子 132、语法障碍 13
一、实验类型设计型:线性分类器设计(Fisher 准则)二、实验目的本实验旨在让同学进一步了解分类器的设计概念,能够根据自己的设计对线性分类器有更深刻地认识,理解 Fisher 准则方法确定最佳线性分界面方法的原理,以及Lagrande 乘子求解的原理。
三、实验条件 matlab 软件四、实验原理
线性判别函数的一般形式可表示成
其中
根据 Fisher 选择投影方向 W 的原则,即使原样本向量在该方向上的投影能兼顾类间分布尽可能分开,类内样本投影尽可能密集的要求,用以评价投影方向 W的函数为:
上面的公式是使用 Fisher 准则求最佳法线向量的解,该式比较重要。另外,该式这种形式的运算,我们称为线性变换,其中式一个向量,是的逆矩阵,如是d 维,和都是 d×d 维,得到的也是一个 d 维的向量。
向量就是使 Fisher 准则函数达极大值的解,也就是按 Fisher 准则将 d 维*空
间投影到一维Y空间的最佳投影方向,该向量的各分量值是对原d维特征向量求加权和的权值。
以上讨论了线性判别函数加权向量 W 的确定方法,并讨论了使 Fisher 准则函数极大的 d 维向量的计算方法,但是判别函数中的另一项尚未确定,一般可采用以下几种方法确定如
或者
或当与已知时可用
…… 当 W0 确定之后,则可按以下规则分类,
使用 Fisher 准则方法确定最佳线性分界面的方法是一个著名的方法,尽管提出该方法的时间比较早,仍见有人使用。
五、实验内容已知有两类数据和二者的概率已知=0.6,=0.4。
中数据点的坐标对应一一如下:
数据:
*1=
0.23310.64991.05240.25180.56220.13330.9407
-0.2126
0.0507
-0.08101.0650
-0.02470.31221.16530.8137
-0.3399
0.5152
0.7226
-0.20**
0.4070
-0.1717
-1.0573
-0.2099*2=
2.33851.67301.78442.12131.51181.8340
1.87041.77141.56482.45681.69911.7259
2.04662.37572.08282.38012.16142.2604*3=
0.53381.08311.11760.44390.59011.0756
1.00720.43530.48410.71270.45761.1275
0.77051.00850.84180.78401.03150.9548 数据点的对应的三维坐标为*1=
1.40102.08141.37401.97392.58901.9539
1.25001.26142.18311.14661.59201.4664
2.93131.83402.71982.60302.14652.9414
*2=
1.02980.91540.82001.06781.28891.4334
0.70911.37441.22660.55920.99830.7126
1.28331.26801.24460.55031.14351.1288*3=
0.62100.54980.89320.73241.49430.7644
1.21591.14080.61971.40840.84001.3729
0.77311.34390.95860.73930.86511.1458
数据的样本点分布如下图:
图 1:样本点分布图
六、实验要求 1)请把数据作为样本,根据 Fisher 选择投影方向的原则,使原
样本向量在该方向上的投影能兼顾类间分布尽可能分开,类内样本投影尽可能密集的要求,求出评价投影方向的函数,并在图形表示出来。并在实验报告中表示出来,并求使取极大值的。用matlab完成Fisher线性分类器的设计,程序的语句要求有注释。
2)根据上述的结果并判断(1,1.5,0.6)(1.2,1.0,0.55),(2.0,0.9,0.68),(1.2,1.5,0.89),(0.23,2.33,1.43),属于哪个类别,并画出数据分类相应的结果图,要求画出其在上的投影。
3)回答如下问题,分析一下的比例因子对于 Fisher 判别函数没有影响的原因。
七、实验结果 1、源代码*1=[0.23310.64991.0524
1.1974...
0.29080.66820.9023
0.1333...0.9407
-0.2126
0.0507
-0.0810
0.7315...
0.3345
1.0650
-0.02470.3122
0.6655...
0.58381.2653
0.8137
-0.3399
0.5152...
0.7226
-0.20**
0.4070
-0.1717
-1.0573
-0.2099]';2.19461.63652.0155...
2.06812.47971.9692
1.8340...
1.87041.77141.5648
1.9329...
2.20271.75232.4883
1.7259...
2.04662.37572.0828
2.0798...
1.94492.23731.9235
2.2604]';0.85140.41640.5536...
0.60710.49281.0927
1.0756...
1.00720.43530.4841
1.0992...
1.02991.01240.8544
1.1275...
0.77051.00850.8418
0.8784...
0.97510.41580.7533
0.9548]';
%存储第一类点 1.23011.16551.1829...
1.76322.41522.8472
1.9539...
1.25001.26142.1831
1.7909...
1.33221.70872.9353
1.4664...
2.93131.83402.7198
2.3148...
2.03531.23271.5673
2.9414]';0.96111.49010.9399...
1.14050.80501.4601
1.4334...
0.70911.37441.2266
1.1833...
0.87980.51500.9120
0.7126...
1.28331.26801.2446
1.3392...
1.18081.47080.7679
1.1288]';1.36560.67081.4342...
0.95080.57841.0915
0.7644...
1.21591.14080.6197
0.6603...
1.39280.69090.5381
1.3729...
0.77311.34390.9586
0.7379...
0.75480.67391.3699
1.1458]';
%存储第二类点 Pw1=0.6Pw2=0.4%求第一类点的均值向量 m1m1*=mean(*1(:))%全部平均 m1y=mean(y1(:))%全部平均 m1z=mean(z1(:))%全部平均 m1=[m1*
m1y
m1z]%求第二类点的均值向量 m2m2*=mean(*2(:))%全部平均 m2y=mean(y2(:))%全部平均 m2z=mean(z2(:))%全部平均 m2=[m2*
m2y
m2z]%求第一类类内离散矩阵 S1S1=zeros(3,3)fori=1:36
S1=S1+([*1(i),y1(i),z1(i)]'-m1)*([*1(i),y1(i),z1(i)]'-m1)'end%求第二类类内离散矩阵 S2S2=zeros(3,3)fori=1:36
S2=S2+([*2(i),y2(i),z2(i)]'-m2)*([*2(i),y2(i),z2(i)]'-m2)'end%求总类内离散度矩阵 SwSw=S1+S2%求向量 W*W=(inv(Sw))*(m1-m2)%画出决策面
*=0:.1:2.5y=0:.1:3[*,Y]=meshgrid(*,y)Z=(W(1)**+W(2)*Y)/(-W(3))mesh(*,Y,Z)%保持 holdon%透视决策面 hiddenoff%求第一类样品的投影值均值Y1=0fori=1:36
Y1=Y1+W'*[*1(i),y1(i),z1(i)]'endM1=Y1/36%求第二类样品的投影值均值Y2=0fori=1:36
Y2=Y2+W'*[*2(i),y2(i),z2(i)]'endM2=Y2/36%选取阈值Y0Y0=(M1+M2)/2+(log(Pw1)/log(Pw2))/70%判定未知样品类别 Y0
disp('点*1(1,1.5,0.6)属于第一类')
plot3(1,0.5,0.6,'or')else
disp('点*1(1,1.5,0.6)属于第二类 Y0
disp('点*2(1.2,1.0,0.55)属于第一类')
plot3(1.2,1.0,0.55,'or')else
disp('点*2(1.2,1.0,0.55)属于第二类 Y0
disp('点*3(2.0,0.9,0.68)属于第一类')
plot3(2.0,0.9,0.68,'or')else
disp('点*3(2.0,0.9,0.68)属于第二类 Y0
disp('点*4(1.2,1.5,0.89)属于第一类')
plot3(1.2,1.5,0.89,'or')else
disp('点*4(1.2,1.5,0.89)属于第二类 Y0
disp('点*5(0.23,2.33,1.43)属于第一类')
plot3(0.23,2.33,1.43,'or')else
disp('点*5(0.23,2.33,1.43)属于第二类')
plot3(0.23,2.33,1.43,'ob')end2、决策面
图 2:决策面(红色代表第一类,蓝色代表第二类)
3、参数决策面向量 W=
-0.0798
0.2005
-0.0478 阈值 Y0=
0.1828 样本点分类*1=
1.0000
1.5000
0.6000
点*1(1,1.5,0.6)属于第一类
*2=
1.2000
1.0000
0.5500
点*2(1.2,1.0,0.55)属于第二类
*3=
2.0000
0.9000
0.6800
点*3(2.0,0.9,0.68)属于第二类
*4=
1.2000
1.5000
0.8900
点*4(1.2,1.5,0.89)属于第二类
*5=
0.2300
2.3300
1.4300
点*5(0.23,2.33,1.43)属于第一类八、实验分析 1、比例因子决策面向量 W 的比例因子并不影响判别函数。分析如下:
阈值:
判别函数:
可以证明,Y0 与 WT 有关,所以当改变 WT 时,判别函数两边同时改变,所以WT 并不影响判别函数。
2、语法障碍由于之前不怎么接触 matlab,所以此次实验做得比较漫长。为了方便程序进行矩阵的运算,我把原始数据由矩阵转化成一维向量,后面的求和运算相应的转化为循环结构实现。