Python机器学习应用之基于线性判别模型的分类篇详解


Posted in Python onJanuary 18, 2022

一、Introduction

线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用。LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的。这点和PCA不同。PCA是不考虑样本类别输出的无监督降维技术。 LDA的思想可以用一句话概括,就是“投影后类内方差最小,类间方差最大”。我们要将数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。即:将数据投影到维度更低的空间中,使得投影后的点,会形成按类别区分,一簇一簇的情况,相同类别的点,将会在投影后的空间中更接近方法。

1 LDA的优点

  • 在降维过程中可以使用类别的先验知识经验,而像PCA这样的无监督学习则无法使用类别先验知识;
  • LDA在样本分类信息依赖均值而不是方差的时候,比PCA之类的算法较优

2 LDA的缺点

  • LDA不适合对非高斯分布样本进行降维,PCA也有这个问题
  • LDA降维最多降到类别数 k-1 的维数,如果我们降维的维度大于 k-1,则不能使用 LDA。当然目前有一些LDA的进化版算法可以绕过这个问题
  • LDA在样本分类信息依赖方差而不是均值的时候,降维效果不好
  • LDA可能过度拟合数据

3 LDA在模式识别领域与自然语言处理领域的区别

在自然语言处理领域,LDA是隐含狄利克雷分布,它是一种处理文档的主题模型。本文讨论的是线性判别分析 LDA除了可以用于降维以外,还可以用于分类。一个常见的LDA分类基本思想是假设各个类别的样本数据符合高斯分布,这样利用LDA进行投影后,可以利用极大似然估计计算各个类别投影数据的均值和方差,进而得到该类别高斯分布的概率密度函数。当一个新的样本到来后,我们可以将它投影,然后将投影后的样本特征分别带入各个类别的高斯分布概率密度函数,计算它属于这个类别的概率,最大的概率对应的类别即为预测类别

二、Demo

#%%导入基本库
# 基础数组运算库导入
import numpy as np 
# 画图库导入
import matplotlib.pyplot as plt 
# 导入三维显示工具
from mpl_toolkits.mplot3d import Axes3D
# 导入LDA模型
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# 导入demo数据制作方法
from sklearn.datasets import make_classification
#%%模型训练
# 制作四个类别的数据,每个类别100个样本
X, y = make_classification(n_samples=1000, n_features=3, n_redundant=0,
                           n_classes=4, n_informative=2, n_clusters_per_class=1,
                           class_sep=3, random_state=10)
# 将四个类别的数据进行三维显示
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=20, azim=20)
ax.scatter(X[:, 0], X[:, 1], X[:, 2], marker='o', c=y)
plt.show()

Python机器学习应用之基于线性判别模型的分类篇详解

#%%建立 LDA 模型
lda = LinearDiscriminantAnalysis()
# 进行模型训练
lda.fit(X, y)
#%%查看lda的参数
print(lda.get_params())

Python机器学习应用之基于线性判别模型的分类篇详解

#%%数据可视化
#模型预测
X_new = lda.transform(X)
# 可视化预测数据
plt.scatter(X_new[:, 0], X_new[:, 1], marker='o', c=y)
plt.show()

Python机器学习应用之基于线性判别模型的分类篇详解

#%%使用新的数据进行测试
a = np.array([[-1, 0.1, 0.1]])
print(f"{a} 类别是: ", lda.predict(a))
print(f"{a} 类别概率分别是: ", lda.predict_proba(a))

a = np.array([[-12, -100, -91]])
print(f"{a} 类别是: ", lda.predict(a))
print(f"{a} 类别概率分别是: ", lda.predict_proba(a))

a = np.array([[-12, -0.1, -0.1]])
print(f"{a} 类别是: ", lda.predict(a))
print(f"{a} 类别概率分别是: ", lda.predict_proba(a))

a = np.array([[0.1, 90.1, 9.1]])
print(f"{a} 类别是: ", lda.predict(a))
print(f"{a} 类别概率分别是: ", lda.predict_proba(a))

Python机器学习应用之基于线性判别模型的分类篇详解

三、基于LDA 手写数字的分类

#%%导入库函数
# 导入手写数据集 MNIST
from sklearn.datasets import load_digits
# 导入训练集分割方法
from sklearn.model_selection import train_test_split
# 导入LDA模型
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# 导入预测指标计算函数和混淆矩阵计算函数
from sklearn.metrics import classification_report, confusion_matrix
# 导入绘图包
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
#%% 导入MNIST数据集
mnist = load_digits()
# 查看数据集信息
print('The Mnist dataeset:\n',mnist)

# 分割数据为训练集和测试集
x, test_x, y, test_y = train_test_split(mnist.data, mnist.target, test_size=0.1, random_state=2)

Python机器学习应用之基于线性判别模型的分类篇详解

#%%## 输出示例图像
images = range(0,9)

plt.figure(dpi=100)
for i in images:
    plt.subplot(330 + 1 + i)
    plt.imshow(x[i].reshape(8, 8), cmap = matplotlib.cm.binary,interpolation="nearest")
# show the plot
plt.show()

Python机器学习应用之基于线性判别模型的分类篇详解

#%%利用LDA对手写数字进行训练与预测
m_lda = LinearDiscriminantAnalysis()# 建立 LDA 模型
# 进行模型训练
m_lda.fit(x, y)
# 进行模型预测
x_new = m_lda.transform(x)
# 可视化预测数据
plt.scatter(x_new[:, 0], x_new[:, 1], marker='o', c=y)
plt.title('MNIST with LDA Model')
plt.show()

Python机器学习应用之基于线性判别模型的分类篇详解

#%% 进行测试集数据的类别预测
y_test_pred = m_lda.predict(test_x)
print("测试集的真实标签:\n", test_y)
print("测试集的预测标签:\n", y_test_pred)
#%% 进行预测结果指标统计 统计每一类别的预测准确率、召回率、F1分数
print(classification_report(test_y, y_test_pred))
# 计算混淆矩阵
C2 = confusion_matrix(test_y, y_test_pred)
# 打混淆矩阵
print(C2)

# 将混淆矩阵以热力图的防线显示
sns.set()
f, ax = plt.subplots()
# 画热力图
sns.heatmap(C2, cmap="YlGnBu_r", annot=True, ax=ax)  
# 标题 
ax.set_title('confusion matrix')
# x轴为预测类别
ax.set_xlabel('predict')  
# y轴实际类别
ax.set_ylabel('true')  
plt.show()

Python机器学习应用之基于线性判别模型的分类篇详解

Python机器学习应用之基于线性判别模型的分类篇详解

Python机器学习应用之基于线性判别模型的分类篇详解

四、小结

LDA适用于线性可分数据,在非线性数据上要谨慎使用。 886~~~

到此这篇关于Python机器学习应用之基于线性判别模型的分类篇详解的文章就介绍到这了,更多相关Python 线性判别模型的分类内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用Python制作获取网站目录的图形化程序
May 04 Python
图文详解WinPE下安装Python
May 17 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
Python自定义线程类简单示例
Mar 23 Python
Python读取本地文件并解析网页元素的方法
May 21 Python
深入理解Django-Signals信号量
Feb 19 Python
python 进程的几种创建方式详解
Aug 29 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
Sep 16 Python
python中format函数如何使用
Jun 22 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
Python如何实现Paramiko的二次封装
Jan 30 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 Python
68行Python代码实现带难度升级的贪吃蛇
Jan 18 #Python
如何利用Python实现n*n螺旋矩阵
Jan 18 #Python
聊聊Python String型列表求最值的问题
Jan 18 #Python
Python的三个重要函数详解
Jan 18 #Python
python多线程方法详解
Jan 18 #Python
用Python生成会跳舞的美女
基于Pygame实现简单的贪吃蛇游戏
Dec 06 #Python
You might like
php 常用类整理
2009/12/23 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
PHP接口继承及接口多继承原理与实现方法详解
2017/10/18 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
javascript options属性集合操作代码
2009/12/28 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
layui的table中显示图片方法
2018/08/17 Javascript
解决layui调用自定义方法提示未定义的问题
2019/09/14 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
python opencv之分水岭算法示例
2018/02/24 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
2019/05/09 Python
python简单区块链模拟详解
2019/07/03 Python
Python + OpenCV 实现LBP特征提取的示例代码
2019/07/11 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
web页面录屏实现
2019/02/12 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
《梅兰芳学艺》教学反思
2014/02/24 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
施工安全协议书范本
2014/09/26 职场文书
2014年最新离婚协议书范本
2014/10/11 职场文书
满月酒邀请函
2015/01/30 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
房地产置业顾问工作总结
2015/10/23 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript