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(一)Python环境安装
Aug 20 Python
Python中的startswith和endswith函数使用实例
Aug 25 Python
python threading模块操作多线程介绍
Apr 08 Python
python实现马耳可夫链算法实例分析
May 20 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
用python实现百度翻译的示例代码
Mar 09 Python
python3使用print打印带颜色的字符串代码实例
Aug 22 Python
python3 tcp的粘包现象和解决办法解析
Dec 09 Python
在Tensorflow中实现梯度下降法更新参数值
Jan 23 Python
Python while循环使用else语句代码实例
Feb 07 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
Mar 12 Python
利用python控制Autocad:pyautocad方式
Jun 01 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 array_intersect()函数使用代码
2009/01/14 PHP
PHP基础学习小结
2011/04/17 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
jquery数组过滤筛选方法grep()简介
2014/06/06 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
微信小程序开发之IOS和Android兼容的问题
2017/09/26 Javascript
微信小程序实现天气预报功能
2018/07/18 Javascript
每个 JavaScript 工程师都应懂的33个概念
2018/10/22 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
javascriptvoid(0)含义以及与"#"的区别讲解
2019/01/19 Javascript
少女风vue组件库的制作全过程
2019/05/15 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
Django开发中的日志输出的方法
2018/07/02 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
Python适配器模式代码实现解析
2019/08/02 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
8款使用 CSS3 实现超炫的 Loading(加载)的动画效果
2015/03/17 HTML / CSS
美国著名手表网站:Timepiece
2017/11/15 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
职专应届生求职信
2013/11/16 职场文书
学习方法演讲稿
2014/05/10 职场文书
初中学校对照检查材料
2014/08/19 职场文书
员工试用期自我评价
2014/09/18 职场文书
Pytest中skip skipif跳过用例详解
2021/06/30 Python