本文将介绍Fisher线性判别的原理和具体实践,阅读时间约8分钟,关注公众号可在后台领取数据集资源哦^-^

Fisher线性判别

1.背景介绍

生活中我们往往会遇到具有高维特性的数据,如个人信息,天气数据等。而在使用统计方法处理分类等模式识别问题时,通常是在低维空间展开研究的。而一般基于统计学习方法难以求解高维数据,所以降维成了解决问题的突破口。

对于高维空间样本,投影到一维坐标上,可能会出现样本特征混杂的现象,这将难以进行分类。如果寻找一个投影方向,使得样本集合在该投影方向最易区分,找寻这个最优方向的过程就是Fisher线性判别所解决的问题。

Fisher判别法的基本思想是将 类维数据集尽可能地投影到一条直线方向,使得类与类之间尽可能分开,再通过确定一个分类阈值来进行分类。

2.模型建立及求解方法

2.1基本参量

假设有个N1属于类的n维样本以及N2个属于类的n维样本,将两者合并成一个集合。经线性组合可得标量:

下面定义几个基本参量。在n维X空间中:

  1. 各类样本均值:

2.各类类内离散度矩阵:

3.总类内离散度矩阵:

同理我们可以求得在一维Y空间中的各类样本均值,各类类内离散度以及总类内离散度矩阵。此处不再赘述。

2.2求解

Fisher判别想要尽可能地在一维空间分开样本,需要使各类类间差异性尽可能大(均值差尽可能大),同时类内离散度尽可能小。根据这一思想,我们可以设立如下准则函数:

通过推导(此处省略,详细过程可参考《模式识别》西安电子科技大学出版社),可以求出最优投影方向:

我们可以将任意未知样本投影到该一维方向上:

此时我们还需要设定一个阈值来对一维方向上的样本进行划分。此处我们采用

其中,

是投影到一维方向后两类样本各自的均值。

根据公式(6),我们可以对降维后的样本进行分类。

当样本投影到一维后的y值大于y0时,样本属于第一类,反之属于第二类。

3.实验

3.1实验环境

本文使用python3.7进行编程仿真,并使用了sklearn、numpy、matplotlib等python库。

3.2iris数据集分类问题

iris数据集中包含了3类鸢尾花特征数据。每一类分别有50条样本,每条样本有4个维度的特征数据(花萼长度,花萼宽度,花瓣长度,花瓣宽度)。首先我们先对数据集进行可视化观察。

我们对花萼长度、宽度这两个特征,对150条样本进行比较。如下图所示,可以发现第一类鸢尾花与第二、三两类区分较大,可以通过一条直线来较好地划分。而第二、三两类鸢尾花之间在花萼宽度上差异较小,难以直接区分,第三类鸢尾花的花萼长度整体较长。

再对花瓣长度、宽度两个特征进行可视化比较。如下图所示,可以发现三类鸢尾花在这两个特征上区分较为明显,可以较为容易的进行区分。

然后,我们对每两类样本分别进行fisher线性判别分类,并分别计算正确率。以第二类和第三类数据为例,先分别从两类样本中随机选取30个样本作为训练集,剩余的20个样本作为测试集。通过2.2中求解方法对最优方向w进行求解,将样本数据投影到该方向上的一维直线上,效果如下图所示:

红色的代表第一类鸢尾花,蓝色代表第二类鸢尾花。可以发现,样本已经较好地被区分为两类。

根据公式(6)可计算得到阈值,可以将测试样本进行完全的区分,正确率为100%。

对三类数据样本两两进行分类,并将每两组10次测试结果的正确率求平均值作为最终正确率。可以得到下表:

可以看出,第一、二类和第一、三类鸢尾花都可以被很好地区分开,分类正确率稳定在100%;而第二、三类在某些情况下会出现错误分类的样本,但整体正确率仍然较高,达到94.25%。

由此可见,Fisher线性判别在iris数据集上能够取得较好的分类效果。

3.2sonar数据集分类问题

Sonar数据集共207条样本,每个样本含有60维的特征。样本分为R、M两类,其中R类样本有96条,M样本有111条。

与3.1相同,我们分别将R、M两类样本的60%作为训练集,剩下的作为测试集。其中R类测试样本为39条,M类测试样本为45条。

由于我们不确定以多少维特征进行Fisher线性判别分类效果较好,所以我们从采用随机抽取1维到60维特征的方式不断测试,计算采用不同维数的特征时的分类正确率,重复实验二十次。并将20次实验的平均值作为采用不同特征纬度下Fisher线性判别的分类正确率。

最终,我们得到的实验效果图如下:

从中,我们可以看出从采用一维特征进行分类到采取18维特征,正确率不断上升,最高可达到70.2%左右;但采用维数超过18维后,分类正确率开呈现波动下降趋势。

我们对数据集进行重新划分,观察训练样本数量对分类效果的影响。我们分别采用占总数据集70%,60%(上文实验),50%的训练样本进行训练,并在剩余样本中测试正确率。第一、三组实验结果如下:

第一组(70%)

第二组(50%)

可以发现当增加训练样本数量时,测试正确率整体上升,正确率最高上升至74.2%,且当增加样本维数时正确率趋于稳定,稳定在72%左右;当减少训练样本数量时,无明显的改善情况,整体变化趋势与第二组实验接近。

在本问题中,考虑两类测试样本的数量不同,我们采用下式计算新的阈值。

再次进行实验,训练、测试集比例为3:2。我们可以发现分类正确率并未改善。

4.思考

Fisher线性判别在对复杂样本降维分类的情况中具有重要作用。在对维数少的样本进行分类时,Fisher线性判别往往能起到较好的效果;在对维数较高的样本分类时,特征冗余度上升,投影到一维直线后区分难度大大提高,正确率降低或无法再继续上升。在实际分类时,我们需要对训练、测试样本的比例进行实验,更多的训练样本可能会提升分类的正确率,但也有可能造成过拟合现象,降低Fisher线性判别的泛化能力。

在处理维数较多数据时,我们可对特征先进行主成分分析等关联度分析方法,降低数据维数,再进行Fisher线性判别,可能可以取得更理想的效果,此处不再过多论述。

5.代码及数据集获取

sklearn包自带iris数据集,本文直接导入。sonar数据集可关注微信公众号后在后台回复sonar领取。代码已上传作者的github。

https://github.com/zoukeh/Fisher

上文2.2中最优投影方向公式推导可参考https://blog.csdn.net/bless2015/article/details/104765976(如有侵权请告知)

作者水平有限,若有错误敬请指正。请多多支持关注哦^-^

fisher判别_经典模式识别:Fisher线性判别相关推荐

  1. 经典分类:线性判别分析模型!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:小雨姑娘,康涅狄格大学,Datawhale成员 这几天看了看SVM ...

  2. 模式识别(1)Fisher线性判别

    Fisher线性判别 分类是我们经常会遇到是问题,下面主要介绍Fisher线性判别,利用Fisher算法来分类UCI数据集中的Iris数据集和Sonar数据集. 一.数据集说明 UCI数据库是加州大学 ...

  3. Fisher线性判别 模式识别 例题

    ** Fisher线性判别 ** [例4-1]本程序为纸币100元A面与50元A 面的Fisher判别门限的程序,通过全局变量 dat自动从样本数据中将内容读入dat[10][4][8][8][60] ...

  4. 基于fisher线性判别法的分类器设计

    0.引言说明 这篇文章实际上是楼主上的模式识别课程的课堂报告,楼主偷懒把东西直接贴出来了.选择fisher判别法的原因主要是想学习一下这个方法,这个方法属于线性判别法,操作起来和lda判别法近乎没啥区 ...

  5. Fisher线性判别

    Fisher线性判别 一.算法介绍 1.背景: 在应用统计方法解决模式识别问题时,一再碰到的问题之一就是维度问题,在低维空间里解析上或计算上行得通的方法,在高维空间里往往行不通.降低维度有时会成为处理 ...

  6. 朴素贝叶斯分类器与Fisher线性判别实践——水果识别为例

    开篇:本次博客主要分享二分类水果实现案例,样本构造显然不具备泛化.大数量特性以及背景均为纯白色是为了方便目标提取.大家若需要更好的水果样本,Github上有许多的优秀案例.本次代码计算效率较低,代码有 ...

  7. Fisher线性判别散度矩阵Sb,Sw 另一种表达形式的证明

    Fisher线性判别中散度矩阵的表现形式可以改写,类内散度: Sw=∑i=1c∑j:yj=i(xj−μi)(xj−μi)T=12∑i,jA(w)ij(xi−xj)(xi−xj)TSw=∑i=1c∑j: ...

  8. 【机器学习】Fisher线性判别与线性感知机

    来源 | AI小白入门 作者 | 文杰 编辑 | yuquanle 原文链接 Fisher线性判别与线性感知机 ​ Fisher线性判别和线性感知机都是针对分类任务,尤其是二分类,二者的共同之处在于都 ...

  9. Fisher线性判别算法原理及实现 MATLAB

    Fisher线性判别算法原理及实现 MATLAB 一.Fisher判别器原理 二.代码实现 clc; close all; clear; %% 生成数据 rng(2020); %指定一个种子 mu1 ...

最新文章

  1. OCR引擎Tesseract以及pytesseract详解及实例
  2. 单件模式(Singleton Pattern)
  3. python 发送邮件附件很慢_python下smtpsendmail发送特别慢
  4. python 2和Python3的常见区别及修改办法
  5. acm怎么提交java程序_acm提交java
  6. python 股票行情_十分钟学会用Python交易股票
  7. 软考 | 软考高项论文该如何去写?
  8. 再多的非标电气设计也不怕了
  9. 如何通过蒲公英批量获取iPhone设备的udid
  10. 如何去爱一个人[转]
  11. oracle000936,奇怪的ORA-000936错误
  12. VMD/NAMD命令/规则
  13. AlphaGo挑战围棋九段高手李世石
  14. MATLAB中audioread函数用法
  15. 提高员工执行力,提高项目执行力,提升企业执行力
  16. 2017第36届西安春季广告标识办公印刷LED光电照明产业博览会会刊(参展商名录)
  17. Avoid The Lakes(避开湖泊C++)
  18. 使用xlsx.utils.js前端导出excel
  19. 关于在Qt C++中飞天诚信Rockey5加密狗使用记录
  20. 【转】Win7注册表的使用(更新中)

热门文章

  1. 50、Power Query-Text.Contains的学习
  2. windows不能改密码
  3. ABAP X类型 和 xstring类型
  4. ALEIDoc EDI(6)--Filter Conversion
  5. Oracle 海量数据处理- 索引的选择
  6. 计划策略-20-订货型生产
  7. 三星手机把按键音的选项去掉了打字时还是有声音
  8. SAP固定资产减值准备的处理方法
  9. SAP 调用smartforms打印如何统计实际打印状态和打印次数
  10. Nginx变身爆火神器,手把手教你在永洪BI中应用