fisher算法及其matlab实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Fisher 判别法讲解以及matlab 代码实现
两类的线形判别问题可以看作是把所有样本都投影到一个方向上,然后在这个一维空间中确定一个分类的阈值。过这个预置点且与投影方向垂直的超平面就是两类的分类面。
第一个问题,如何确定投影方向?
这里只讨论两类分类的问题.训练样本集是X ={x1,x2...xn},每个样本是一个d 维
向量,其中第一类w1={11x ,12x ...11n x },第二类w2={21x
,2
2x ...22n x }。我们
要寻求一个投影方向w (w 也是一个d 维向量),投影以后样本变成:i y =i T
x w (y
是一个标量),i=1...n
在原样本空间中,类均值为:
∑∈=
i
j w x j i
i x
n m 1
i=1,2(一共两类的均值)
(ps.i
m 是一个d*1的矩阵,假设每个维度是一个变量值,mi 中的每一维度就
是这些变量值的均值,如下图所示
:
图1
特别注明:有些例子给的矩阵是这样的:
图2
这里的单个样本是1*d 的矩阵,要注意计算的时候将其转置,不然套用fisher 算法公式的时候就会发现最后得到的矩阵维数不对。
定义各类类内的离散度矩阵为:(类内离散度矩阵其实就是类协方差矩阵,类在多于一个样本,且样本维度>1时是一个矩阵)
∑∈--=
i
j w x T
i
j i j i m x m x S ))((
(因为,
j
x 是一个d*1的矩阵,也可称作d 维向量,
i
m 也是一个d*1的矩阵,
所以最后得到的i
S 一定是一个d*d 的矩阵)
(在用matlab 计算的时候直接用cov (wi )即可得到想要的协方差矩阵,故直接
计算不探究细节时图2可直接cov 算协方差,不用根据公式转置来转置去,不过matlab 中算的协方差被缩小了(n1-1)倍,计算时i
S =cov (w1)*(n1-1))
总的类内离散度矩阵:
21S S S w +=
类间离散度矩阵定义为:
T b m m m m S ))((2121--=
在投影以后的一维空间里,两类的均值分别是;
i
T
w x j T
i
w y i i
ii m w x w
N y N m i
j i j ===
∑∑∈∈1
1 i=1,2
故类内离散度不再是一个矩阵,而是一个值
∑∈-=
i
j w y ii
i ii m y S 2)( i=1,2
总类内离散度为:
1111S S S ww +=
类间离散度:
2
1111)
(m m S bb -=
要使得需求的方向投影能在投影后两类能尽可能的分开,而各类内部又尽可能的
聚集,可表示成如下准则,即fisher 准则:
ww
bb
S S w J =
)(max
将公式代入并通过拉格朗日求极值的方法,可得投影方向:
)(211
m m S w w -=-
(w 是一个d*1的矩阵,或者说亦是一个d 维向量) 阈值可表示为:
)(2
1
22110m m w +-=
最后将待确定样本代入
0)(w x w x g T +=
判断)(x g 的符号和哪个类相同,确定其属于哪个类别。 例子(注意表格中所给的样本维度和公式中变量维度的问题) 代码已经运行无误
代码:
%读取excel中特定单元格的数据
w12=xlsread('E:\模式识别\理论学习\胃病分类问题.xls','C2:F16');
%分别选取类1和类2、测试样本的数据
w1=w12(1:5,:);
w2=w12(6:12,:);
sample=w12(13:15,:);
%计算类1和类2的样本数
r1=size(w1,1);
r2=size(w2,1);
r3=size(sample,1);
%计算类1和类2的均值(矩阵)
m1=mean(w1);
m2=mean(w2);
%各类类内离散度矩阵(协方差矩阵)
s1=cov(w1)*(r1-1);
s2=cov(w2)*(r2-1);
%总类内离散度矩阵
sw=s1+s2;
%投影向量的计算公式
w=inv(sw)*(m1-m2)';
%计算投影后的一位空间内,各类的均值
y1=w'*m1';
y2=w'*m2';
%计算阈值
w0=-1/2*(y1+y2);
%和类相同符号被归为同类
for i=1:r3
y(i)=sample(i,:)*w+w0;
if y(i)*(w'*w1(1,:)'+w0)>0
y(i)=1;
else
y(i)=2;
end
End
判断得出第一个待测样本属于类1,第二,三个待测样本属于类2
如果想进一步知道样本矩阵是如何转置得到最后结果的,可看下面这个例子,这个例子没有用到matlab内置的cov协方差函数(用cov可以直接用样本数据直接进行矩阵运算,不用转置成样本维度向量),所以要进行转置后代入fisher准则公式求解.