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

Fisher线性分类器,也称为Fisher判别分析(Fisher Discriminant Analysis),是一种经典的线性分类方法,用于将数据集分成两个或多个不同类别。它是由英国统计学家罗纳德·A·费舍尔(Ronald A. Fisher)在1936年提出的。 Fisher线性分类器的目标是找到一个投影方向,使得在该方向上不同类别的样本尽可能地分开,同一类别的样本尽可能地接近。具体而言,Fisher线性分类器通过计算类间散布矩阵和类内散布矩阵的比值来确定最佳投影方向。 在MATLAB中,可以使用`fitcdiscr`函数来实现Fisher线性分类器。该函数可以根据训练数据集自动学习最佳的投影方向,并返回一个分类器对象。然后,可以使用该分类器对象对新的样本进行分类预测。 下面是使用MATLAB实现Fisher线性分类器的示例代码: ```matlab % 假设有一个训练数据集X和对应的标签y X = ...; % 训练数据集 y = ...; % 标签 % 使用fitcdiscr函数学习Fisher线性分类器 classifier = fitcdiscr(X, y); % 对新的样本进行分类预测 newSample = ...; % 新的样本 predictedLabel = predict(classifier, newSample); ``` 以上代码中,`X`是训练数据集,`y`是对应的标签。`fitcdiscr`函数会根据这些数据学习最佳的投影方向,并返回一个分类器对象`classifier`。然后,可以使用`predict`函数对新的样本`newSample`进行分类预测,得到预测的标签`predictedLabel`。 希望以上介绍对您有帮助!如果您有任何进一步的问题,请随时提问。
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Z-Jackie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值