fisher判别_经典模式识别:Fisher线性判别
本文将介绍Fisher线性判别的原理和具体实践,阅读时间约8分钟,关注公众号可在后台领取数据集资源哦^-^
Fisher线性判别
1.背景介绍
生活中我们往往会遇到具有高维特性的数据,如个人信息,天气数据等。而在使用统计方法处理分类等模式识别问题时,通常是在低维空间展开研究的。而一般基于统计学习方法难以求解高维数据,所以降维成了解决问题的突破口。
对于高维空间样本,投影到一维坐标上,可能会出现样本特征混杂的现象,这将难以进行分类。如果寻找一个投影方向,使得样本集合在该投影方向最易区分,找寻这个最优方向的过程就是Fisher线性判别所解决的问题。
Fisher判别法的基本思想是将 类维数据集尽可能地投影到一条直线方向,使得类与类之间尽可能分开,再通过确定一个分类阈值来进行分类。
2.模型建立及求解方法
2.1基本参量
假设有个N1属于类的n维样本以及N2个属于类的n维样本,将两者合并成一个集合。经线性组合可得标量:
下面定义几个基本参量。在n维X空间中:
各类样本均值:
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线性判别相关推荐
- 经典分类:线性判别分析模型!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:小雨姑娘,康涅狄格大学,Datawhale成员 这几天看了看SVM ...
- 模式识别(1)Fisher线性判别
Fisher线性判别 分类是我们经常会遇到是问题,下面主要介绍Fisher线性判别,利用Fisher算法来分类UCI数据集中的Iris数据集和Sonar数据集. 一.数据集说明 UCI数据库是加州大学 ...
- Fisher线性判别 模式识别 例题
** Fisher线性判别 ** [例4-1]本程序为纸币100元A面与50元A 面的Fisher判别门限的程序,通过全局变量 dat自动从样本数据中将内容读入dat[10][4][8][8][60] ...
- 基于fisher线性判别法的分类器设计
0.引言说明 这篇文章实际上是楼主上的模式识别课程的课堂报告,楼主偷懒把东西直接贴出来了.选择fisher判别法的原因主要是想学习一下这个方法,这个方法属于线性判别法,操作起来和lda判别法近乎没啥区 ...
- Fisher线性判别
Fisher线性判别 一.算法介绍 1.背景: 在应用统计方法解决模式识别问题时,一再碰到的问题之一就是维度问题,在低维空间里解析上或计算上行得通的方法,在高维空间里往往行不通.降低维度有时会成为处理 ...
- 朴素贝叶斯分类器与Fisher线性判别实践——水果识别为例
开篇:本次博客主要分享二分类水果实现案例,样本构造显然不具备泛化.大数量特性以及背景均为纯白色是为了方便目标提取.大家若需要更好的水果样本,Github上有许多的优秀案例.本次代码计算效率较低,代码有 ...
- 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: ...
- 【机器学习】Fisher线性判别与线性感知机
来源 | AI小白入门 作者 | 文杰 编辑 | yuquanle 原文链接 Fisher线性判别与线性感知机 Fisher线性判别和线性感知机都是针对分类任务,尤其是二分类,二者的共同之处在于都 ...
- Fisher线性判别算法原理及实现 MATLAB
Fisher线性判别算法原理及实现 MATLAB 一.Fisher判别器原理 二.代码实现 clc; close all; clear; %% 生成数据 rng(2020); %指定一个种子 mu1 ...
最新文章
- OCR引擎Tesseract以及pytesseract详解及实例
- 单件模式(Singleton Pattern)
- python 发送邮件附件很慢_python下smtpsendmail发送特别慢
- python 2和Python3的常见区别及修改办法
- acm怎么提交java程序_acm提交java
- python 股票行情_十分钟学会用Python交易股票
- 软考 | 软考高项论文该如何去写?
- 再多的非标电气设计也不怕了
- 如何通过蒲公英批量获取iPhone设备的udid
- 如何去爱一个人[转]
- oracle000936,奇怪的ORA-000936错误
- VMD/NAMD命令/规则
- AlphaGo挑战围棋九段高手李世石
- MATLAB中audioread函数用法
- 提高员工执行力,提高项目执行力,提升企业执行力
- 2017第36届西安春季广告标识办公印刷LED光电照明产业博览会会刊(参展商名录)
- Avoid The Lakes(避开湖泊C++)
- 使用xlsx.utils.js前端导出excel
- 关于在Qt C++中飞天诚信Rockey5加密狗使用记录
- 【转】Win7注册表的使用(更新中)