当有一组预测变量需要被分为两个类,一般使用逻辑回归模型。举例,使用信用分和平均存款余额预测贷款是否违约。但当预测变量有多种可能时,则一般会使用线性判别分析(linear discriminant analysis, 简称 LDA).

线性判别分析

线性判别分析的场景举例:
给定高校篮球运动员的场均篮板和得分,预测他们会被三个高校中的一个录取。虽然LDA和逻辑回归模型都可以进行分类。实践表明,在对多个类进行预测时,LDA比逻辑回归要稳定得多,因此当响应变量有两个以上类别时,LDA是首选的算法。与逻辑回归相比,当样本量较小时LDA的表现也更好,这让它成为无法收集大样本时的首选方法。

构建LDA模型

线性判别算法对数据有一些要求:

  • 响应变量必须是类别变量。线性判别是分类算法,因此响应变量应该是类别变量。

  • 预测变量应遵循正太分布。首先检查每个预测变量是否大致符合正太分布,如果不满足,需要选择转换算法使其近似满足。

  • 每个预测变量有相同的标准差。现实中很难能够满足该条件,但我们可以对数据进行标准化,让变量统一为标准差为1,均值为0.

  • 检查异常值。在用于LDA之前要检查异常值。可以简单通过箱线图或散点图查进行检测。

一旦这些假设满足,LDA会估计下面值:

μk{μ_k}μk​: 第 kth{k^{th}}kth类所有训练集的均值.

σ2{σ^2}σ2: 第k类样本方差的加权平均值.

πk{π_k}πk​: 属于第k类的训练观察值的比例.

然后LDA将这些数字代入以下公式,并将每个观测值X = X分配给公式产生最大值的类:

Dk(x)=x∗(μk/σ2)–(μk2/2σ2)+log(πk){D_k(x) = x * (μ_k/σ^2) – (μ_k^2/2σ^2) + log(π_k)}Dk​(x)=x∗(μk​/σ2)–(μk2​/2σ2)+log(πk​)

注意,LDA的名称中有线性,因为上面函数产生的值来自x的线性函数的结果。

LDA应用场景

LDA模型在现实中应用广泛,下面简单举例:

市场营销
零售公司经常使用LDA将购物者分为几类。然后利用建立LDA模型来预测特定购物者是低消费者、中等消费者还是高消费者,使用预测变量如收入、年度总消费额和家庭人数等变量。

医学领域
医院或医疗机构的研究人员通常利用LDA预测给定一组异常细胞是否会导致轻微、中度或严重疾病。

产品研发
一些公司会利用LDA模型预测消费者属于每天、每周、每月或年使用他们的产品,基于预测变量有性别、年度收入、使用类似产品的频率。

生态领域
研究者利用LDA模型预测是否给定珊瑚礁的健康状况:好、中等、坏、严重。预测变量包括大小、年度污染情况、年份。

示例

下面分步实现LDA,首先加载必要的包。

加载工具包

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.model_selection import cross_val_score

加载数据

本实例使用iris数据集,下面代码展示如何加载数据,并转为DataFrame:

# load iris dataset
iris = datasets.load_iris()# convert dataset to pandas DataFrame
df = pd.DataFrame(data=np.c_[iris['data'], iris['target']],columns=iris['feature_names'] + ['target'])
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)
df.columns = ['s_length', 's_width', 'p_length', 'p_width', 'target', 'species']# view first six rows of DataFrame
print(df.head())print(len(df.index))

输出结果:

#    s_length  s_width  p_length  p_width  target species
# 0       5.1      3.5       1.4      0.2     0.0  setosa
# 1       4.9      3.0       1.4      0.2     0.0  setosa
# 2       4.7      3.2       1.3      0.2     0.0  setosa
# 3       4.6      3.1       1.5      0.2     0.0  setosa
# 4       5.0      3.6       1.4      0.2     0.0  setosa# 150

我们看到包括150条观测记录,下面构建LDA预测属于那个分类。

预测变量为:

Sepal length
Sepal width
Petal length
Petal width

结果分类包括:

setosa
versicolor
virginica

拟合模型

使用LinearDiscriminantAnalysis 函数拟合模型:

# define predictor and response variables
x = df[['s_length', 's_width', 'p_length', 'p_width']]
y = df['species']# Fit the LDA model
model = LinearDiscriminantAnalysis()
model.fit(x.values, y.values)

使用模型进行预测

我们已经拟合了模型,为了评估模型,使用k折分组教程验证. 使用10个分组,重复3次:

# Define method to evaluate model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)# evaluate model
scores = cross_val_score(model, x, y, scoring='accuracy', cv=cv, n_jobs=-1)
print(np.mean(scores))# 0.9800000000000001

模型平均准确率为:98%。 下面使用测试数据进行预测:

# define new observation
new = [5, 3, 1, .4]# predict which class the new observation belongs to
model.predict([new])# array([0]) 即第一类:setosa

可视化结果

最后使用LDA图查看线性判别结果:

# define data to plot
x = iris.data
y = iris.target
model = LinearDiscriminantAnalysis()
data_plot = model.fit(x, y).transform(x)
target_names = iris.target_names# create LDA plot
plt.figure()
colors = ['red', 'green', 'blue']
lw = 2
for color, i, target_name in zip(colors, [0, 1, 2], target_names):plt.scatter(data_plot[y == i, 0], data_plot[y == i, 1], alpha=.8, color=color,label=target_name)# add legend to plot
plt.legend(loc='best', shadow=False, scatterpoints=1)# display LDA plot
plt.show()

Python实现线性判别分析教程相关推荐

  1. R 实现线性判别分析教程

    本文介绍线性判别分析概念,并通过示例介绍R的实现过程. 介绍线性判别分析模型 线性判别分析用于基于一组变量把响应变量分为俩类或更多的算法.但线性判别算法对数据有一些要求: 响应变量必须是类别变量.线性 ...

  2. 史上最好的LDA(线性判别分析)教程

    一.前言 最近由于研究需要,要用到线性判别分析(LDA).于是找了很多资料来看,结果发现大部分讲的都是理论知识,因此最后还是看的一知半解,后来终于找到了个英文的文档,作者由PCA引入LDA,看过后豁然 ...

  3. python判别分析_python中的线性判别分析

    我正在用python进行线性判别分析,但是有一些问题.使用给定的教程,hereis能够使用python计算线性判别分析,并得到如下图: 使用以下代码:import pandas as pd featu ...

  4. 机器学习算法系列(十)-线性判别分析算法(一)(Linear Discriminant Analysis Algorithm)

    阅读本文需要的背景知识点:拉格朗日乘数法.一丢丢编程知识 一.引言   前面学习了一种用回归的方式来做分类的算法--对数几率回归算法,下面再来学习另一种分类算法--线性判别分析算法1(Linear D ...

  5. 【机器学习基础】数学推导+纯Python实现机器学习算法27:LDA线性判别分析

    Python机器学习算法实现 Author:louwill Machine Learning Lab 线性判别分析(Linear Discriminant Analysis,LDA)是一种经典的线性分 ...

  6. 『矩阵论笔记』线性判别分析(LDA)最全解读+python实战二分类代码+补充:矩阵求导可以参考

    线性判别分析(LDA)最全解读+python实战二分类代码! 文章目录 一.主要思想! 二.具体处理流程! 三.补充二中的公式的证明! 四.目标函数的求解过程! 4.1.优化问题的转化 4.2.拉格朗 ...

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

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

  8. Fisher线性判别分析原理解析及其Python程序实现两例

    一.Fisher线性判别分析原理解析与算法描述 Fisher:1890-1962, 英国数学家,生物学家,现代统计学奠基人之一,证明了孟德尔的遗传律符合达尔文的进化论. Fisher线性判别分析(Li ...

  9. LDA(线性判别分析(普通法))详解 —— python

    在这里和大家道个歉,因为我有一篇matlab的LDA和这篇内容大致相同,我就犯懒了,直接复制,没想到公式复制过来全变成了图片,然后造成了,排版有问题,非常难看,真的很抱歉!!!以后大家督促哈,我再犯懒 ...

最新文章

  1. 数据通信技术(九:OSPF特殊区域配置(Cisco))
  2. 磁铁对于小型直流电机的影响
  3. libpcap捕包机制分析(三)
  4. 在Java中避免空检查
  5. (转)使用Spring配置文件实现AOP
  6. Oracle数据库脚本学习:建用户、删用户、建表、改表、删表
  7. python学习笔记——守护进程
  8. 程序员保持健康的7个秘诀
  9. Oracle 故障整理
  10. FPGA之SSI接口协议实现
  11. ORACLE_mldn_002
  12. 查看JDK版本和安装路径
  13. 100多套毕业论文答辩PPT模板百度网盘链接
  14. windows平台HTTP代理服务器搭建(CCproxy)
  15. 归因分析:淘宝直播数据助理及其价值研究
  16. modbus模拟设备工具ModRSsim的使用
  17. socketTCP协程文件+信息传递 - TCP聊天文件服务器v1.9 - 划时代的版本更新(4.6万字)
  18. SSS1700 QFN36单芯片设计一款USB Typec耳机|支持线控和欧美规自动切换USB耳机方案
  19. Java项目:springboot医院信息管理系统
  20. 【Wayland】Weston多屏显示

热门文章

  1. 双系统android,如何在Android手机上实现双系统
  2. #踩过的坑# 企业微信被封了怎么办?
  3. Java-好玩的猜数小游戏
  4. DB2数据库认证系列教程——IBM DB2认证考前必备
  5. 癌症/肿瘤免疫治疗最新研究进展(2022年4月)
  6. 二、伊森商城 环境 虚拟机配置 p3
  7. 【BFS】lydsy3161 孤舟蓑笠翁
  8. 【原创】华为ICS Lite 批量下载,不限数量,突破200个下载限制,几千个文件批量下载。
  9. 修改ua html5,html5中bootstrap表单样式文件html,兼容多种UA终端
  10. Twilio Inc.(TWLO)2020年第三季度收益电话会议记录