线性分类器之Fisher线性判别-MATLAB实现

       在许多实际问题中,由于样本特征空间的类条件密度函数常常很难确定,利用Parzen窗等非参数方法估计分布往往需要大量样本,而且随着特征空间维数的增加所需样本数急剧增加,因此在实际问题中,往往不去求类条件概率密度函数,而是利用样本集直接设计分类器。具体说就是首先给定某个判别函数,然后利用样本集确定判别函数中的未知参数。这种方法称为判别函数法,并且根据其中判别函数的形式,可分为线性分类器和非线性分类器。线性分类器较为简单,在计算机上容易实现,在模式识别中应用非常广泛。在此讨论线性分类器中的Fisher线性判别,应用统计方法解决很多实际问题的时候,经常会遇到维数问题。在低维空间里解析上或者计算上可行的方法,在高维空间里往往行不通,因此降低维数有时就成为处理实际问题的关键。

       可以考虑把d维空间的样本投影到一直线上,形成一维空间,即把维数压缩到一维,这在数学上总很容易办到。然而即使样本在d维空间里形成若干紧凑的互相分得开的集群,若把它投射到任意的一条直线上,也可能使几类样本混在一起而变得无法识别。但在一般情况下,总可以找到某个方向,使在这个方向的直线上,样本的投影能分开的很好。问题是如何根据实际情况来找到这条最好的、最易于分类的投影线。这就是Fisher线性判别所需要解决的基本问题。

       对于两类问题的Fisher线性判别的具体方法如下:

  • 计算各类样本均值向量m_{i},N_{i}\omega _{i}类的样本个数。

                                                                                m_{i}= \frac{1}{N^{_{i}}}\sum_{X\epsilon \omega _{i}}^{ }X, i=1,2

  • 计算样本类内离散度矩阵S_{i}和总类内离散度矩阵S_{w}

                                                                    S{_{i}}=\sum_{X\epsilon \omega _{I}}^{ }\left ( X-m{_{i}} \right )\left ( X-m{_{i}} \right )^{T}, i= 1,2

                                                                                        S_{w}= S_{1}+S_{2}

  • 计算样本类间离散度矩阵S_{b}.

                                                                             S{_{b}}=\left ( m{_{1}}-m{_{2}} \right )\left ( m{_{1}}-m{_{2}} \right )^{T}

  • 求向量w^{\ast }。为此定义Fisher准则函数

                                                                                     J_{F}\left ( w \right )=\frac{w^{T}S_{b}w}{w^{T}S_{w}w}

使得J_{F}\left ( w \right )取得最大值的w^{\ast }

                                                                                  w^{\ast }=S_{w}^{-1}\left ( m{_{1}}-m{_{2}} \right )

  • 将训练数据集所有样本进行投影。

                                                                                        y= \left ( w^{^{\ast }} \right )^{T}X

  • 计算在投影空间上的分隔阈值y_{0}。阈值的选取可以有不同的方案,较常用的一种为

                                                                                 y_{0}= \frac{N_{1}\widetilde{m_{1}}+N_{2}\widetilde{m_{2}}}{N_{1}+N_{2}}

另一种为

                                                                    y_{0}= \frac{\widetilde{m_{1}}+\widetilde{m_{2}}}{2}+ \frac{ln\left [ P\left ( w_{1} \right ) /P\left ( w_{2} \right )\right ]}{N_{1}+N_{2}-2}

其中,\widetilde{m_{i}}为在一维空间中各类样本的均值:

                                                                                       \widetilde{m_{i}}= \frac{1}{N_{i}}\sum_{y\epsilon \omega _{i}}^{ }y.

样本类内离散度\widetilde{s_{i}^{2}}和总类内离散度为\widetilde{s_{w}}

\widetilde{S_{i}^{2}}=\sum_{y\in w_{i}}\left ( y-\widetilde{m_{i}} \right ),i=1,2

                                                                                                 \widetilde{s_{w}}=\widetilde{s_{1}^{2}}+\widetilde{s_{2}^{2}}      

  • 对于给定的X,计算它在w^{\ast }上的投影点y。

                                                                                                   y= \left ( w^{^{\ast }} \right )^{T}X          

  • 根据决策规则分类,有

                                                                                                \left\{\begin{matrix} y> y{_{0}}\Rightarrow X\epsilon w_{1}\\ y< y{_{0}}\Rightarrow X\epsilon w_{2} \end{matrix}\right.         

Fisher线性判别解决多类问题时,首先实现两类Fisher分类,然后根据返回的类型与新的类别再做两类Fisher分类,又能够得到比较接近的类别,以此类推,直至所有的类别,最后得出未知样本的类别。

数据集:

                           

数据集共有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);

数据下载地址:数据-线性分类器之Fisher线性判别-MATLAB实现-Microsoft文档类资源-CSDN下载

运行结果:综合正确率:50.85%。

 理论知识参考许国根的《模式识别与智能计算的MATLAB实现》。可能代码不够完美,欢迎大家积极探讨,共同进步!

评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z-Jackie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值