fisher算法及其matlab实现.doc
文本预览下载声明
Fisher判别法讲解以及matlab代码实现
两类的线形判别问题可以看作是把所有样本都投影到一个方向上,然后在这个一维空间中确定一个分类的阈值。过这个预置点且与投影方向垂直的超平面就是两类的分类面。
第一个问题,如何确定投影方向?
这里只讨论两类分类的问题是一个d*1的矩阵,假设每个维度是一个变量值,mi中的每一维度就是这些变量值的均值,如下图所示:
图1
特别注明:有些例子给的矩阵是这样的:
图2
这里的单个样本是1*d的矩阵,要注意计算的时候将其转置,不然套用fisher算法公式的时候就会发现最后得到的矩阵维数不对。
定义各类类内的离散度矩阵为:(类内离散度矩阵其实就是类协方差矩阵,类在多于一个样本,且样本维度1时是一个矩阵)
(因为,是一个d*1的矩阵,也可称作d维向量,也是一个d*1的矩阵,所以最后得到的一定是一个d*d的矩阵)
(在用matlab计算的时候直接用cov(wi)即可得到想要的协方差矩阵,故直接计算不探究细节时图2可直接cov算协方差,不用根据公式转置来转置去,不过matlab中算的协方差被缩小了(n1-1)倍,计算时=cov(w1)*(n1-1))
总的类内离散度矩阵:
类间离散度矩阵定义为:
在投影以后的一维空间里,两类的均值分别是;
i=1,2
故类内离散度不再是一个矩阵,而是一个值
i=1,2
总类内离散度为:
类间离散度:
要使得需求的方向投影能在投影后两类能尽可能的分开,而各类内部又尽可能的聚集,可表示成如下准则,即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)+w00
y(i)=1
显示全部