一、Fisher线性判别分析原理解析与算法描述
Fisher:1890-1962, 英国数学家,生物学家,现代统计学奠基人之一,证明了孟德尔的遗传律符合达尔文的进化论。
Fisher线性判别分析(Linear Discriminant Analysis, 简称Fisher LDA)是一种应用较为广泛的线性分类方法,该方法于1936年由Fisher提出。
Fisher准则的基本原理是,对于d维空间的样本,投影到一维坐标上,样本特征会混杂在一起,难以区分。如果找到一个投影方向,使得样本集合在该投影方向上最易区分,这就是Fisher准则的基本原理。Fisher准则可描述为用投影后数据的统计性质—均值和离散度的函数作为判别优劣的标准。
1.两类问题Fisher准则
已知两类问题N个d维样本x1,x2,…,xN;其中,类别为ωi(i=1,2),Ni是类别ωi的样本容量。设X空间为二维空间,现将X空间的各样本点投影到Y空间的一条直线上,样本特征维数由2维降为1维。若适当选择W的方向,能使二类分开。下面从数学角度寻找最好的投影方向,即寻找最好的变换向量W的问题。


以下是式(1)的Fisher准则函数J(W)的极值求解的具体过程:




上式[即(2)式]就是n维X空间向一维Y空间的最好投影方向,它实际上是多维空间向一维空间的一种映射(W *就是使模式样本的投影在类间最分散、类内最集中的最优解)。

两类问题Fisher线性分类器计算步骤如下:

2.多类问题广义Fisher准则
基于两类问题的Fisher分类准则,我们可以很容易地将其扩展为多类问题的Fisher准则,又称广义Fisher准则(具体介绍此略)。
二、Fisher LDA的Python程序实现两例
Sklearn机器学习库中实现Fisher分类的方法是采用discriminant_analysis类的LinearDiscriminantAnalysis。
Fisher分类器Python关键语句如下:
from sklearn import discriminant_analysis
Fisher_clf = discriminant_analysis.LinearDiscriminantAnalysis()
1.蠓的二分类问题计算及其Python程序实现
蠓的二分类问题是源自美国大学生数学建模竞赛的一个题目,其大意是:生物学家W.L Grogan和W.W.Wirth试图将两种蠓Apf和Af进行鉴别,给出了9只Af和6只Apf蠓虫的触角长度和翅膀长度的数据,已知Af是宝贵的传粉益虫,Apf是某种疾病的载体,要求建立一种模型,正确区分两类蠓虫。
已知6只Apf蠓虫(Apf midges)和9只Af蠓虫(Af midges)的触长、翅长数据表见表1(Talbe 1)和表2(Table 2)所示。

蠓的二分类问题:
问题1: 试给出该问题的Fisher分类器;
问题2: 有三个待识别的模式样本,它们分别是(1.24,1.80)T ,(1.28,1.84)T,(1.40,2.04)T,试问这三个样本属于哪一种蠓。
按照前面给出的两类问题Fisher线性分类器计算步骤,蠓的二分类问题计算过程如下:









本例蠓虫二分类问题,采用Fisher LDA的Python程序运行界面截图如下:

下面是蠓虫二分类问题Fisher LDA的Python程序清单:

#Fisher线性判别分析-Fisher LDA
#蠓虫的Fisher二分类程序
#Filename: Fisher_LDA_Midge.ipynb
#Import Library
import numpy as np
from sklearn import discriminant_analysis
#Assumed you have X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
X=np.array([[1.14,1.78],[1.18,1.96],[1.20,1.86],[1.26,2.00],[1.30,2.00],[1.28,1.96],
[1.24,1.72],[1.36,1.74],[1.38,1.64],[1.38,1.82],[1.38,1.90],[1.40,1.70],[1.48,1.82],[1.54,2.08],[1.56,1.78]])
y=np.array([0,0,0,0,0,0,1,1,1,1,1,1,1,1,1])
#(X,y)作为训练集,前6个为Apf类 (类标签:0),后9个样本为Af类 (类标签:1)
#定义Fisher分类器对象fisher_clf
fisher_clf = discriminant_analysis.LinearDiscriminantAnalysis()
#调用该对象的训练方法
fisher_clf.fit(X,y)
x_test=np.array([[1.24,1.8],[1.28,1.84],[1.4,2.04]])    #待测试的三个样本
y_test=([0,0,0])    #待测试的三个样本的类标签
#(x_test,y_test)三个样本作为测试集
#调用该对象的测试方法
y_pred=fisher_clf.predict(x_test)
print('测试数据集的正确标签为:',y_test)
print('测试数据集的预测标签为:',y_pred)
from sklearn.metrics import accuracy_score
testing_acc=accuracy_score(y_test, y_pred)*100
print('Fisher线性分类器测试准确率: {:.2f}%'.format(testing_acc))

2.鸢尾花三分类问题及其Python程序实现
(1) 鸢尾花数据集介绍
Sklearn机器学习包集成了多种数据集,包括糖尿病数据集、鸢尾花数据集(Iris Dataset)等。鸢尾花有三个亚属,分别是山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。
鸢尾花数据集的每条记录有4个特征变量(分别是萼片长度、萼片宽度、花瓣长度、花瓣宽度)和1个类别变量,每条记录为一个样本,共有150个样本。Iris是鸢尾植物,鸢尾植物分三类,类别变量取值有三个,它们分别是:0表示山鸢尾,1表示变色鸢尾,2表示维吉尼亚鸢尾。
Iris中有两个属性iris.data,iris.target。data是数据样本矩阵,矩阵各列代表萼片长度、萼片宽度、花瓣长度、花瓣宽度,矩阵各行代表某个被测量的鸢尾植物,共采集了150个样本记录。
from sklearn.datasets import load_iris #导入iris数据集
iris = load_iris() #加载iris数据集
print(iris.data)
输出结果:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]

[6.7 3. 5.2 2.3]
[6.3 2.5 5. 1.9]
[6.5 3. 5.2 2. ]
[6.2 3.4 5.4 2.3]
[5.9 3. 5.1 1.8]]
target是一个向量,存储了data中每条记录属于哪一类鸢尾植物,因此向量的长度是150。因为有3类鸢尾植物,因此target向量元素有3个不同取值(0-山鸢尾,1-变色鸢尾,2-维吉尼亚鸢尾),分别代表3种不同鸢尾植物的类标签。
print(iris.target) #输出真实标签
print(len(iris.target)) #共150个样本, 每个样本有4个特征
print(iris.data.shape)
输出结果:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
150
(150, 4)
从输出结果可以看出,类标签共分成三类,前面50个类标签为0,中间50个类标签为1,后面50个类标签为2。
(2) 鸢尾花三分类问题Python程序实现
本例鸢尾花三分类问题,采用Fisher LDA的Python程序运行界面截图如下:

下面是鸢尾花三分类问题Fisher LDA的Python程序清单:

#Fisher线性判别分析-Fisher LDA
#鸢尾花的Fisher三分类Python程序
#Filename: Fisher_LDA_Iris.ipynb
import numpy as np
from sklearn import discriminant_analysis
from sklearn import datasets
np.random.seed(1000)
iris=datasets.load_iris()
iris_x=iris.data
iris_y=iris.target
indices=np.random.permutation(len(iris_x))
#随机选取数据集中的120个样本(数据集的80%样本)作为训练集
iris_x_train=iris_x[indices[:-30]]
iris_y_train=iris_y[indices[:-30]]
#数据集剩下的30个样本(数据集的20%样本)作为测试集
iris_x_test=iris_x[indices[-30:]]
iris_y_test=iris_y[indices[-30:]]
#定义Fisher分类器对象fisher_clf
fisher_clf = discriminant_analysis.LinearDiscriminantAnalysis()
#调用该对象的训练方法
fisher_clf.fit(iris_x_train,iris_y_train)
#调用该对象的测试方法
iris_y_pred=fisher_clf.predict(iris_x_test)
print('测试数据集的正确标签为:',iris_y_test)
print('测试数据集的预测标签为:',iris_y_pred)
from sklearn.metrics import accuracy_score
testing_acc=accuracy_score(iris_y_test,iris_y_pred)*100
print('Fisher线性分类器测试准确率: {:.2f}%'.format(testing_acc))

(Email联系:yuanzywhu@163.com)
发布日期:2021年03月15日

Fisher线性判别分析原理解析及其Python程序实现两例相关推荐

  1. 【基础机器学习算法原理与实现】使用感知器算法LDA、最小二乘法LSM、Fisher线性判别分析与KNN算法实现鸢尾花数据集的二分类问题

    本文设计并实现了PerceptronLA.PseudoIA.LeastSM.LinearDA.KNN等五个算法类,以及DataProcessor的数据处理类.对感知器算法LDA.最小二乘法LSM的伪逆 ...

  2. Fisher线性判别分析以及python实现

    文章目录 线性判别函数基本概念 Fisher线性判别分析基本思想 最优方向推导过程 转换为判别函数 完整代码 线性判别函数基本概念 我们主要讨论在两类情况下判别函数为线性的情况,这里给出一般情况:g( ...

  3. Fisher线性判别分析

    目录 前言 一.简单定义 二.使用步骤 1.通过spss导入数据 2.通过spss进行分析 3.除此之外,该算法还可以用于多分类. 总结 前言 今天学习了分类,对于二分类,经常用的有逻辑回归和Fish ...

  4. LDA主题模型原理解析与python实现

    本文转自:LDA主题模型原理解析与python实现_wind_blast的博客-CSDN博客   python实现: #-*- coding:utf-8 -*- import logging impo ...

  5. Fisher线性判别分析Fisher Linear Distrimination

    Fisher线性判别分析是一种线性分类方法,它的主要思想是:是类内的方差小,类均值之间相差比较大.(类间大,类内小) 以两个类的分类为例: 将两个类由在x1,x2上投影到向量u 上,这样由二维转到了一 ...

  6. python有两个运行程序分别是什么_运行python程序的两种方式

    [单选题]I wonder why ________ are so interested in action movies. [单选题]项目经理的职责不包括以下哪项内容 ? [简答题]结合项目的特点和 ...

  7. python打开方式包括_运行Python程序有两种方式:________和________。

    运行Python程序有两种方式:________和________. 答: 交互式 文件式 自觉的人,心目中有一张蓝图,人生理想.但是不知道世界的游戏规则 答:× 山水画的鉴赏方法? 答:1.首先看风 ...

  8. 运行python程序的两种方式交互式和文件式_Python基础知识2

    运行Python程序的两种方式 小白学习,如有错误欢迎指点 一.每位小白写的第一个Python程序 1.运行Python程序的两种方式 1.1 交互式模式(即时对话) 打开cmd,打开Python解释 ...

  9. 运行python程序的两种方式交互式和文件式_执行Python程序的两种方式

    交互式(了解) 交互式环境下,敲完一条命令按下enter键马上能看到结果,调试程序方便.程序无法永久保存,关掉cmd窗口数据就消失了. 命令行式(了解) 打开文本编辑器,在文本编辑器中写入一串字符. ...

最新文章

  1. Java NIO系列教程(二) Channel
  2. 参考: 40个轻量级 JavaScript 库
  3. 安装composer出现链接补上的问题
  4. java使用httpclient调用上传图片接口[示例]
  5. Linux shell文件测试运算符
  6. 【168天】黑马程序员27天视频学习笔记【Day07】
  7. 3dsmax子菜单无法选择_3DsMax—用平面图片制作3D模型
  8. 软件测试工程师-数据库
  9. iscsi:IO操作流程(三)
  10. 如何走出物联网死亡之井?
  11. 通过复制oracle软件方式安装oracle数据库
  12. 【Python】python帮助文档
  13. Java 文件上传与下载
  14. layui扩展第三方模块_Layui集成第三方插件nicescroll
  15. 3、思科模拟器介绍 (认识思科模拟器界面、安装思科模拟器、思科模拟器汉化)
  16. CVPR 2019 论文大盘点—目标检测篇
  17. 第188篇,想赚钱唯有只争朝夕(扶摇生财思维)
  18. 容器化技术(Docker相关)
  19. n叉树的遍历递归实现
  20. 51单片机简单乐曲演奏(青花瓷)

热门文章

  1. asp.net 4.0 遨游3 cookie问题一例
  2. 有道云笔记中用图框和线条表达逻辑
  3. 局域网限速软件_局域网IP限速怎么配置,限速多少比较合适
  4. PHP--地球坐标系转为火星坐标系再转为高德坐标系
  5. Delphi 调用Codesoft打印条码
  6. Qz学算法-数据结构篇(表达式、递归)
  7. 创建制作 MacOS High Sierra 正式版 USB 安装盘
  8. 斗图神器--纯前端实现视频转GIF制作表情包(已开源)
  9. 2011年重大安全事件记载
  10. 日期计数器—C++实现