美文网首页
Matlab-线性分类器之Fisher线性判别

Matlab-线性分类器之Fisher线性判别

作者: 行者无欲 | 来源:发表于2019-05-02 21:58 被阅读0次

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

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

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

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

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

    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}

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

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

    4.求向量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 )

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

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

    6.计算在投影空间上的分隔阈值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\epsilon \omega _{i}}^{ }\left (y- \widetilde{m_{i}}\right ),i=1,2

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

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

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

    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实现》。可能代码不够完美,欢迎大家积极探讨,共同进步!

    相关文章

      网友评论

          本文标题:Matlab-线性分类器之Fisher线性判别

          本文链接:https://www.haomeiwen.com/subject/yqsonqtx.html