fisher算法及其matlab实现

发布时间:2018-06-28 13:09:26   来源:文档文库   
字号:

Fisher判别法讲解以及matlab代码实现

两类的线形判别问题可以看作是把所有样本都投影到一个方向上,然后在这个一维空间中确定一个分类的阈值。过这个预置点且与投影方向垂直的超平面就是两类的分类面。

第一个问题,如何确定投影方向?

这里只讨论两类分类的问题.训练样本集是X={x1,x2...xn},每个样本是一个d维向量,其中第一类w1={...},第二类w2={...}。我们要寻求一个投影方向ww也是一个d维向量),投影以后样本变成: = (y是一个标量)i=1...n

在原样本空间中,类均值为:

i=1,2(一共两类的均值)

ps.是一个d*1的矩阵,假设每个维度是一个变量值,mi中的每一维度就是这些变量值的均值,如下图所示:

1

特别注明:有些例子给的矩阵是这样的:

2

这里的单个样本是1*d的矩阵,要注意计算的时候将其转置,不然套用fisher算法公式的时候就会发现最后得到的矩阵维数不对。

定义各类类内的离散度矩阵为:(类内离散度矩阵其实就是类协方差矩阵,类在多于一个样本,且样本维度>1时是一个矩阵)

(因为,是一个d*1的矩阵,也可称作d维向量,也是一个d*1的矩阵,所以最后得到的一定是一个d*d的矩阵)

(在用matlab计算的时候直接用covwi)即可得到想要的协方差矩阵,故直接计算不探究细节时图2可直接cov算协方差,不用根据公式转置来转置去,不过matlab中算的协方差被缩小了(n1-1)倍,计算时=covw1*n1-1))

总的类内离散度矩阵:

类间离散度矩阵定义为:

在投影以后的一维空间里,两类的均值分别是;

i=1,2

故类内离散度不再是一个矩阵,而是一个值

i=12

总类内离散度为:

类间离散度:

要使得需求的方向投影能在投影后两类能尽可能的分开,而各类内部又尽可能的聚集,可表示成如下准则,即fisher准则:

将公式代入并通过拉格朗日求极值的方法,可得投影方向

w是一个d*1的矩阵,或者说亦是一个d维向量)

阈值可表示为:

最后将待确定样本代入

判断的符号和哪个类相同,确定其属于哪个类别。

例子注意表格中所给的样本维度和公式中变量维度的问题

代码已经运行无误

代码:

%读取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准则公式求解.

x=xlsread('E:\模式识别\理论学习\污染水域问题.xls','C3:F14');

x1=x(1:5,:)';

x2=x(6:10,:)';

sample=x(11:12,:)';

m1=zeros(size(x1,1),1);

% 求类内离散度矩阵

m1=mean(x1,2)

m2=mean(x2,2)

% 求类内离散度矩阵

s1=zeros(size(x1,1),size(x1,1));

for i=1:size(x1,2)

s1=s1+(x1(:,i)-m1)*(x1(:,i)-m1)';

end

s2=zeros(size(x2,1),size(x2,1));

for i=1:size(x2,2)

s2=s2+(x2(:,i)-m2)*(x2(:,i)-m2)';

end

sw=s1+s2;

w=inv(sw)*(m1-m2);

y1=w'*m1;

y2=w'*m2;

w0=-1/2*(y1+y2);

for i=1:size(sample,2)

y(i)=w'*sample(:,i);

if y(i)+w0>0

y(i)=1;

else

y(i)=2;

end

end

本文来源:https://www.2haoxitong.net/k/doc/8b9a713158fafab069dc02e6.html

《fisher算法及其matlab实现.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式