在许多实际问题中,由于样本特征空间的类条件密度函数常常很难确定,随着特征空间维数的增加所需样本数急剧增加,而且利用Parzen窗等非参数方法估计分布往往需要大量样本,因此在实际问题中,往往不去求类条件概率密度函数,而是利用样本集直接设计分类器。具体说就是首先给定某个判别函数,然后利用样本集确定判别函数中的未知参数。这种方法称为判别函数法,并且根据其中判别函数的形式,可分为线性分类器和非线性分类器。线性分类器较为简单,在计算机上容易实现,在模式识别中应用非常广泛。在此讨论线性分类器中的Fisher线性判别,应用统计方法解决很多实际问题的时候,经常会遇到维数问题。在低维空间里解析上或者计算上可行的方法,在高维空间里往往行不通,因此降低维数有时就成为处理实际问题的关键。
可以考虑把d维空间的样本投影到一直线上,形成一维空间,即把维数压缩到一维,这在数学上总很容易办到。然而即使样本在d维空间里形成若干紧凑的互相分得开的集群,若把它投射到任意的一条直线上,也可能使几类样本混在一起而变得无法识别。但在一般情况下,总可以找到某个方向,使在这个方向的直线上,样本的投影能分开的很好。问题是如何根据实际情况来找到这条最好的、最易于分类的投影线。这就是Fisher线性判别所需要解决的基本问题。
对于两类问题的Fisher线性判别的具体方法如下:
1.计算各类样本均值向量,是类的样本个数。
2.计算样本类内离散度矩阵和总类内离散度矩阵。
3.计算样本类间离散度矩阵。
4.求向量。为此定义Fisher准则函数
使得取得最大值的为
5.将训练数据集所有样本进行投影。
6.计算在投影空间上的分隔阈值。阈值的选取可以有不同的方案,较常用的一种为
另一种为
其中,为在一维空间中各类样本的均值:
样本类内离散度和总类内离散度为为
7.对于给定的X,计算它在上的投影点y。
8.根据决策规则分类,有
数据集共有10000条数据,分为56维自变量,第57维为标记,两类分别为1和2。
代码:
clc
clear
close all
data=load('训练数据.mat');
type1=data.data(1:5000,1:56);
type2=data.data(5001:10000,1:56);
%类的均值向量
m1=mean(type1);
m2=mean(type2);
%各类内离散度矩阵
s1=zeros(56);
s2=zeros(56);
for i=1:1:4000
s1=s1+(type1(i,:)-m1)'*(type1(i,:)-m1);
end
for i=1:1:4000
s2=s2+(type2(i,:)-m2)'*(type2(i,:)-m2);
end
%总类内离散矩阵
sw=s1+s2;
%投影方向
w=((sw^-1)*(m1-m2)')';
%判别函数以及阈值T
T=-0.5*(m1+m2)*inv(sw)*(m1-m2)';
kind1=0;
kind2=0;
newtype1=[];
newtype2=[];
for i=4001:5000
x=type1(i,:)
g=w*x'+T;
if g>0
newtype1=[newtype1;x];
kind1=kind1+1;
else
newtype2=[newtype2;x];
end
end
for i=4001:5000
x=type2(i,:)
g=w*x'+T;
if g>0
newtype1=[newtype1;x];
else
newtype2=[newtype2;x];
kind2=kind2+1;
end
end
correct=(kind1+kind2)/2000;
fprintf('\n综合正确率:%.2f%%\n\n',correct*100);
运行结果:综合正确率:50.85%。
理论知识参考许国根的《模式识别与智能计算的MATLAB实现》。可能代码不够完美,欢迎大家积极探讨,共同进步!
网友评论