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初学者的一些编程技巧
Apr 03 Python
asyncio 的 coroutine对象 与 Future对象使用指南
Sep 11 Python
Python 3.7新功能之dataclass装饰器详解
Apr 21 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
python utc datetime转换为时间戳的方法
Jan 15 Python
Python设计模式之代理模式实例详解
Jan 19 Python
python添加菜单图文讲解
Jun 04 Python
使用pickle存储数据dump 和 load实例讲解
Dec 30 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
用ldap作为django后端用户登录验证的实现
Dec 07 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
python语言中pandas字符串分割str.split()函数
Aug 05 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 项目的方法
2007/01/02 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
PHP反射学习入门示例
2019/06/14 PHP
javascript按位非运算符的使用方法
2013/11/14 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
Python编写百度贴吧的简单爬虫
2015/04/02 Python
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
pycharm设置鼠标悬停查看方法设置
2019/07/29 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
Python字符串格式化输出代码实例
2019/11/22 Python
详解python 中in 的 用法
2019/12/12 Python
Django 再谈一谈json序列化
2020/03/16 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
大学军训感言300字
2014/03/09 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
岗位说明书标准范本
2014/07/30 职场文书
房产协议书范本2014
2014/09/30 职场文书
乡镇群众路线教育实践活动整改措施
2014/10/04 职场文书
公司离职证明范本
2014/10/17 职场文书
应届毕业生自荐信
2015/03/04 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫