【机器学习实战项目】10分钟学会Python怎么用LDA线性判别模型进行分类预测(五)

简介: 【机器学习实战项目】10分钟学会Python怎么用LDA线性判别模型进行分类预测(五)

[toc]

1 前言

1.1 线性判别模型的介绍

线性判别模型(Linear Discriminant Analysis,LDA)是一种经典的监督学习算法,它旨在通过学习输入特征和它们所属类别之间的线性关系来进行分类任务。线性判别模型通常可以被看作是一种分类器,可以用于二元分类和多元分类问题。

线性判别模型的主要思想是将输入特征空间中的样本投影到一条直线或者一个超平面上,从而实现对样本的分类。这个超平面的选择是通过最小化类内距离和最大化类间距离来完成的。类内距离指的是同一类别样本之间的距离,类间距离则指不同类别样本之间的距离。通过最小化类内距离和最大化类间距离,线性判别模型能够更好地区分不同类别的样本。

优点:

  • 线性判别模型是一种经典的监督学习算法,具有较高的可解释性和可理解性,能够提供直观的结果。
  • 线性判别模型具有较快的训练速度和较低的存储成本,适用于处理大型数据集。
  • 线性判别模型能够在高维数据中很好地工作,并且在特征选择方面具有很好的性能。

缺点:

  • 线性判别模型是一种线性模型,对于非线性分类问题的表现可能较差。
  • 线性判别模型对于噪声数据和异常值比较敏感,容易造成误分类。
  • 线性判别模型的分类效果受特征之间相关性的影响,如果存在高度相关的特征,分类效果可能较差。

1.2 线性判别模型的应用

线性判别模型广泛应用于数据分类、降维和特征提取等领域,在实际应用中有很多场景,例如:

  1. 信用评分:根据用户的个人信息和历史数据,对其信用评分进行分类,以决定是否批准贷款。
  2. 医学诊断:根据患者的生理指标和症状,将其分为健康和患病两类,以进行诊断和治疗。
  3. 人脸识别:根据人脸图像的特征向量,将其分为不同的人脸类别,以实现人脸识别和身份验证。
  4. 情感分析:根据文本内容中的关键词和情感指标,将其分为正面、负面和中性等不同的情感类别。
  5. 图像分类:根据图像的特征向量,将其分为不同的图像类别,以进行图像识别和分类等。

在生信领域还是常用于基因表达数据分析、蛋白结构预测、biomarker鉴定和药物设计,LDA可以用于分析分子结构和描述化学性质,从而优化药物设计和发现。

2 demo数据演示

2.1 导入函数

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.datasets import make_classification

2.2 训练模型

# 制作四个类别的数据,每个类别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,auto_add_to_figure=False)
fig.add_axes(ax)
ax.scatter(X[:, 0], X[:, 1], X[:, 2], marker='o', c=y)
plt.show()

建模

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

2.3 预测模型

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

用新数据测试

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))

3 LDA手写数字数据演示

3.1 导入函数

from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
import matplotlib

3.2 导入数据

# 导入MNIST数据集
mnist = load_digits()
# 查看数据集信息
print('The Mnist dataeset:\n',mnist)
# 分割数据为训练集和测试集,7/3分
x, test_x, y, test_y = train_test_split(mnist.data, mnist.target, test_size=0.3, random_state=2)

3.3 输出图像

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()

3.4 建立模型

# 建立 LDA 模型
m_lda = LinearDiscriminantAnalysis()
# 训练模型
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()

3.5 预测模型

y_test_pred = m_lda.predict(test_x)
print("测试集的真实标签:\n", test_y)
print("测试集的预测标签:\n", y_test_pred)

# 统计结果指标
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()

4 讨论

LDA模型还是比较简明扼要的,主要是针对于线性可分数据,判别目的就是使同类别的距离相近,使不同类别的距离隔远。对于非线性可分数据需要特别留意实际情况。

LDA是一种监督学习的降维技术,且每个样本都是区分类别输出的;区别于PCA,PCA是不考虑样本类别的无监督降维技术,但是目的是一样的,都可以理解为将同类别的数据。相比于后者,LDA我认为最大的优势就是基于监督可以参考类别的先验经验,即可以不断“叠加”;然鹅很硬性的一个缺点就是不适合对非高斯分布样本进行降维,这个问题PCA也存在。

目录
相关文章
|
14天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
23天前
|
人工智能 JSON 算法
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
阿里云的人工智能平台 PAI,作为一站式、 AI Native 的大模型与 AIGC 工程平台,为开发者和企业客户提供了 Qwen2.5-Coder 系列模型的全链路最佳实践。本文以Qwen2.5-Coder-32B为例,详细介绍在 PAI-QuickStart 完成 Qwen2.5-Coder 的训练、评测和快速部署。
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
|
8天前
|
编解码 机器人 测试技术
技术实践 | 使用 PAI+LLaMA Factory 微调 Qwen2-VL 模型快速搭建专业领域知识问答机器人
Qwen2-VL是一款具备高级图像和视频理解能力的多模态模型,支持多种语言,适用于多模态应用开发。通过PAI和LLaMA Factory框架,用户可以轻松微调Qwen2-VL模型,快速构建文旅领域的知识问答机器人。本教程详细介绍了从模型部署、微调到对话测试的全过程,帮助开发者高效实现定制化多模态应用。
|
28天前
|
机器学习/深度学习 PyTorch API
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
Transformer架构自2017年被Vaswani等人提出以来,凭借其核心的注意力机制,已成为AI领域的重大突破。该机制允许模型根据任务需求灵活聚焦于输入的不同部分,极大地增强了对复杂语言和结构的理解能力。起初主要应用于自然语言处理,Transformer迅速扩展至语音识别、计算机视觉等多领域,展现出强大的跨学科应用潜力。然而,随着模型规模的增长,注意力层的高计算复杂度成为发展瓶颈。为此,本文探讨了在PyTorch生态系统中优化注意力层的各种技术,
53 6
优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本
|
14天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
40 10
|
16天前
|
机器学习/深度学习 人工智能 算法
人工智能浪潮下的编程实践:构建你的第一个机器学习模型
在人工智能的巨浪中,每个人都有机会成为弄潮儿。本文将带你一探究竟,从零基础开始,用最易懂的语言和步骤,教你如何构建属于自己的第一个机器学习模型。不需要复杂的数学公式,也不必担心编程难题,只需跟随我们的步伐,一起探索这个充满魔力的AI世界。
36 12
|
23天前
|
机器学习/深度学习 Python
机器学习中评估模型性能的重要工具——混淆矩阵和ROC曲线。混淆矩阵通过真正例、假正例等指标展示模型预测情况
本文介绍了机器学习中评估模型性能的重要工具——混淆矩阵和ROC曲线。混淆矩阵通过真正例、假正例等指标展示模型预测情况,而ROC曲线则通过假正率和真正率评估二分类模型性能。文章还提供了Python中的具体实现示例,展示了如何计算和使用这两种工具来评估模型。
44 8
|
23天前
|
机器学习/深度学习 Python
机器学习中模型选择和优化的关键技术——交叉验证与网格搜索
本文深入探讨了机器学习中模型选择和优化的关键技术——交叉验证与网格搜索。介绍了K折交叉验证、留一交叉验证等方法,以及网格搜索的原理和步骤,展示了如何结合两者在Python中实现模型参数的优化,并强调了使用时需注意的计算成本、过拟合风险等问题。
44 6
|
26天前
|
机器学习/深度学习 数据采集 算法
从零到一:构建高效机器学习模型的旅程####
在探索技术深度与广度的征途中,我深刻体会到技术创新既在于理论的飞跃,更在于实践的积累。本文将通过一个具体案例,分享我在构建高效机器学习模型过程中的实战经验,包括数据预处理、特征工程、模型选择与优化等关键环节,旨在为读者提供一个从零开始构建并优化机器学习模型的实用指南。 ####
|
26天前
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!