基于LDA与PCA算法的鸢尾花数据集二维投影比较

news2024/11/29 0:40:45

目录

  • 1. 作者介绍
  • 2. LDA和PCA算法介绍
    • 2.1 LDA算法
    • 2.2 PCA算法
    • 2.3 两个算法的区别与联系
  • 3. 实验过程
    • 3.1 数据集介绍
    • 3.2 算法流程
    • 3.3 核心算法介绍
    • 3.4 完整代码
    • 3.5 实验结果与分析

1. 作者介绍

王鑫,男,西安工程大学电子信息学院,2022级研究生
研究方向:机器视觉与人工智能
电子邮件:30581433@qq.com

路治东,男,西安工程大学电子信息学院,2022级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:2063079527@qq.com

2. LDA和PCA算法介绍

2.1 LDA算法

LDA(线性判别式分析 Linear Discriminant Analysis)是一个经典的 二分类算法,属于机器学习中的监督学习算法,常用来做特征提取、数据降 维和任务分类。在人脸识别、人脸检测等领域发挥重要作用。
主要思想:给定训练样本集,设法将样本投影到一条直线上,使得同类 的样本的投影尽可能的接近、异类样本的投影尽可能的远离(即最小化类内 距离和最大化类间距离)。

2.2 PCA算法

PCA全称为主成分分析算法,是最常用的线性降维方法,它的目标是通过某种线性投影, 将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大), 以此使用较少的数据维度,同时保留住较多的原数据点的特性。
PCA降维的目的,就是为了在尽量保证“信息量不丢失”的情况下,对原始特征进行降维,也就是尽可能将原始特征往具有最大投影信息量的维度上进行投影。将原特征投影到这些维度 上,使降维后信息量损失最小。

2.3 两个算法的区别与联系

相同点:
1.均是降维方法。
2.降维时均使用了矩阵特征分解的思想。
3.两者都假设数据符合高斯分布。
不同点:
1.PCA是无监督的降维方法,而LDA是有监督的降维方法。
2.LDA除了可以降维,还可以用于分类。
3.LDA降维最多降到类别数 k-1的维数(k是样本类别的4.LDA选择的是分类性能最好的投影方向,而PCA选择样本点投影具有最大方差的方向。
这点从下图1可以形象的看出,在某些数据分布下LDA比PCA降维较优。然而,某些某些数据分布下PCA比LDA降维较优,如下图2所示所示:
在这里插入图片描述

3. 实验过程

3.1 数据集介绍

Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预 测鸢尾花卉属于(Setosa(山鸢尾),Versicolour(杂色鸢尾),Virginica(维吉尼亚鸢尾))三个种类中的哪一类。鸢尾花(iris) 数据集,它共有4个属性列和一个品种类别列:sepal length(萼片长度)、sepal width(萼片宽度)、petal length(花瓣 长度)、petal width (花瓣宽度),单位都是厘米。3个品种类别是Setosa、Versicolour、Virginica,样本数量150个,每 类50个。
在这里插入图片描述
数据集的部分数据如图所示
在这里插入图片描述

3.2 算法流程

基于LDA与PCA算法的鸢尾花数据集二维投影比较的算法实现流程如下:
1.加载鸢尾花数据集:使用相关库加载鸢尾花数据集,包括特征向量和对应的类别标签。
2.LDA降维:使用LDA算法对特征向量进行降维。首先,计算各个类别的均值向量和类内散度矩阵。然后,计算类间散度矩阵,并求解广义特征值问题,得到投影方向(特征向量)。选择最大的k个特征值对应的特征向量作为投影方向,其中k是要降低到的维度数。最后,使用选定的投影方向将特征向量映射到新的低维空间中,得到降维后的数据。
3.PCA降维:使用PCA算法对特征向量进行降维。首先,对特征向量进行均值中心化处理。然后,计算特征向量的协方差矩阵。接下来,求解协方差矩阵的特征值和特征向量。选择最大的k个特征值对应的特征向量作为投影方向,其中k是要降低到的维度数。最后,使用选定的投影方向将特征向量映射到新的低维空间中,得到降维后的数据。
4.绘制结果:使用可视化库绘制两种降维方法得到的二维投影结果。可以使用散点图展示不同类别的样本,使用不同的颜色标记不同的类别。
5.比较结果:将LDA和PCA的投影结果放在同一个画面中进行比较。可以使用子图来分别显示LDA和PCA的结果,或者使用不同的颜色或标记在同一个子图中展示两种方法的结果。
通过比较LDA和PCA的降维结果,可以观察它们在鸢尾花数据集上的效果差异,以及它们在保留数据信息和类别可分性方面的表现。

3.3 核心算法介绍

# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data  #将鸢尾花数据集的特征数据存储在X变量中
y = iris.target  #将鸢尾花数据集的标签存储在y变量中
target_names = iris.target_names  #将鸢尾花数据集的目标类别名称存储在target_names变量中

# 使用LDA进行降维
lda = LinearDiscriminantAnalysis(n_components=2)  #创建一个LinearDiscriminantAnalysis对象,指定要降到的维度为2
X_lda = lda.fit_transform(X, y)  # 使用线性判别分析对特征数据进行降维,得到降维后的结果存储在X_lda变量中

# 使用PCA进行降维
pca = PCA(n_components=2)  #创建一个PCA对象,指定要降到的维度为2
X_pca = pca.fit_transform(X)  #使用主成分分析对特征数据进行降维,得到降维后的结果存储在X_pca变量中

加载鸢尾花数据集,将鸢尾花数据集的特征数据存储在X变量中,将鸢尾花数据集的标签存储在y变量中,将鸢尾花数据集的目标类别名称存储在target_names变量中。
创建一个LinearDiscriminantAnalysis对象,指定要降到的维度为2;使用线性判别分析对特征数据进行降维,得到降维后的结果存储在X_lda变量中;创建一个PCA对象,指定要降到的维度为2;使用主成分分析对特征数据进行降维,得到降维后的结果存储在X_pca变量中。

# 绘制LDA结果
plt.figure(figsize=(12, 6))  #创建一个图形窗口,指定图形的大小为12x6
plt.subplot(121)  #创建一个子图,在整个图形窗口中创建一个1x2的子图布局,并定位到第一个子图
for color, i, target_name in zip(['navy', 'turquoise', 'darkorange'], [0, 1, 2], target_names):  #迭代处理颜色列表、[0, 1, 2]列表和目标类别名称列表中的元素。zip()函数用于将这三个列表中的对应元素组合在一起,使得在每次循环中,color、i和target_name分别表示三个列表中对应位置的元素
    plt.scatter(X_lda[y == i, 0], X_lda[y == i, 1], color=color, alpha=.8, lw=2, label=target_name)  #使用scatter()函数绘制LDA降维后的结果的散点图。X_lda[y == i, 0]表示选择标签值等于i的样本在降维结果中的第一维度数据,X_lda[y == i, 1]表示选择标签值等于i的样本在降维结果中的第二维度数据。color表示散点图的颜色,alpha表示散点图的透明度,lw表示散点图中点的边框线宽度,label表示每个散点图的标签。
plt.legend(loc='best', shadow=False, scatterpoints=1)  #添加图例,loc='best'表示图例放置在最佳位置,shadow=False表示不显示图例的阴影,scatterpoints=1表示图例中只显示一个散点
plt.title('LDA of IRIS dataset')  #添加子图的标题为'LDA of IRIS dataset'

# 绘制PCA结果
plt.subplot(122)  #定位到第二个子图
for color, i, target_name in zip(['navy', 'turquoise', 'darkorange'], [0, 1, 2], target_names):  #同样地,迭代处理颜色列表、[0, 1, 2]列表和目标类别名称列表中的元素
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], color=color, alpha=.8, lw=2, label=target_name)  #使用scatter()函数绘制PCA降维后的结果的散点图。与步骤17类似,但是这里是使用PCA降维后的结果进行绘制
plt.legend(loc='best', shadow=False, scatterpoints=1)  # 添加图例
plt.title('PCA of IRIS dataset')  #添加子图的标题为'PCA of IRIS dataset'

创建一个图形窗口,指定图形的大小为12x6;创建一个子图,在整个图形窗口中创建一个1x2的子图布局,并定位到第一个子图;迭代处理颜色列表、[0, 1, 2]列表和目标类别名称列表中的元素。zip()函数用于将这三个列表中的对应元素组合在一起,使得在每次循环中,color、i和target_name分别表示三个列表中对应位置的元素;使用scatter()函数绘制LDA降维后的结果的散点图。X_lda[y = =i, 0]表示选择标签值等于i的样本在降维结果中的第一维度数据,X_lda[y = = i, 1]表示选择标签值等于i的样本在降维结果中的第二维度数据。color表示散点图的颜色,alpha表示散点图的透明度,lw表示散点图中点的边框线宽度,label表示每个散点图的标签;添加图例,loc=‘best’表示图例放置在最佳位置,shadow=False表示不显示图例的阴影,scatterpoints=1表示图例中只显示一个散点;添加子图的标题为’LDA of IRIS dataset‘。
定位到第二个子图;同样地,迭代处理颜色列表、[0, 1, 2]列表和目标类别名称列表中的元素;使用scatter()函数绘制PCA降维后的结果的散点图。与前面类似,但是这里是使用PCA降维后的结果进行绘制;添加图例;添加子图的标题为‘PCA of IRIS dataset’。

3.4 完整代码

import numpy as np
import matplotlib.pyplot as plt  #导入Matplotlib库的pyplot模块,用于绘制图形
from sklearn import datasets  #从Scikit-learn库中导入datasets模块,用于加载数据集
from sklearn.decomposition import PCA  #从Scikit-learn库中导入PCA模块,用于主成分分析降维
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis  #从Scikit-learn库中导入LinearDiscriminantAnalysis模块,用于线性判别分析降维

# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data  #将鸢尾花数据集的特征数据存储在X变量中
y = iris.target  #将鸢尾花数据集的标签存储在y变量中
target_names = iris.target_names  #将鸢尾花数据集的目标类别名称存储在target_names变量中

# 使用LDA进行降维
lda = LinearDiscriminantAnalysis(n_components=2)  #创建一个LinearDiscriminantAnalysis对象,指定要降到的维度为2
X_lda = lda.fit_transform(X, y)  # 使用线性判别分析对特征数据进行降维,得到降维后的结果存储在X_lda变量中

# 使用PCA进行降维
pca = PCA(n_components=2)  #创建一个PCA对象,指定要降到的维度为2
X_pca = pca.fit_transform(X)  #使用主成分分析对特征数据进行降维,得到降维后的结果存储在X_pca变量中

# 绘制LDA结果
plt.figure(figsize=(12, 6))  #创建一个图形窗口,指定图形的大小为12x6
plt.subplot(121)  #创建一个子图,在整个图形窗口中创建一个1x2的子图布局,并定位到第一个子图
for color, i, target_name in zip(['navy', 'turquoise', 'darkorange'], [0, 1, 2], target_names):  #迭代处理颜色列表、[0, 1, 2]列表和目标类别名称列表中的元素。zip()函数用于将这三个列表中的对应元素组合在一起,使得在每次循环中,color、i和target_name分别表示三个列表中对应位置的元素
    plt.scatter(X_lda[y == i, 0], X_lda[y == i, 1], color=color, alpha=.8, lw=2, label=target_name)  #使用scatter()函数绘制LDA降维后的结果的散点图。X_lda[y == i, 0]表示选择标签值等于i的样本在降维结果中的第一维度数据,X_lda[y == i, 1]表示选择标签值等于i的样本在降维结果中的第二维度数据。color表示散点图的颜色,alpha表示散点图的透明度,lw表示散点图中点的边框线宽度,label表示每个散点图的标签。
plt.legend(loc='best', shadow=False, scatterpoints=1)  #添加图例,loc='best'表示图例放置在最佳位置,shadow=False表示不显示图例的阴影,scatterpoints=1表示图例中只显示一个散点
plt.title('LDA of IRIS dataset')  #添加子图的标题为'LDA of IRIS dataset'

# 绘制PCA结果
plt.subplot(122)  #定位到第二个子图
for color, i, target_name in zip(['navy', 'turquoise', 'darkorange'], [0, 1, 2], target_names):  #同样地,迭代处理颜色列表、[0, 1, 2]列表和目标类别名称列表中的元素
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], color=color, alpha=.8, lw=2, label=target_name)  #使用scatter()函数绘制PCA降维后的结果的散点图。与步骤17类似,但是这里是使用PCA降维后的结果进行绘制
plt.legend(loc='best', shadow=False, scatterpoints=1)  # 添加图例
plt.title('PCA of IRIS dataset')  #添加子图的标题为'PCA of IRIS dataset'

# 显示图形
plt.tight_layout()  #调整子图的布局,使其紧凑显示
plt.show()  #显示图形

该代码的作用是加载鸢尾花数据集,使用LDA和PCA算法对数据进行降维,然后将降维结果分别绘制在两个子图中,其中LDA结果在左侧,PCA结果在右侧。
每个子图中的散点图表示不同类别的样本,并通过图例进行标注。最后,显示图形并呈现比较结果。

3.5 实验结果与分析

在这里插入图片描述
基于鸢尾花数据集的LDA和PCA二维投影的比较总结如下:
LDA在保留类别信息方面表现优秀。LDA通过最大化类间散度和最小化类内散度,能够在降维的同时最大化不同类别之间的可分性。在二维投影中,LDA能够有效地将不同鸢尾花类别分开,并展现出明显的聚类效果。
PCA在数据展示和压缩方面具有优势。PCA通过选择方差最大的投影方向,能够在保留数据的主要信息的同时,实现较好的数据压缩效果。在二维投影中,PCA将数据集分布在两个主要方向上,并显示出数据的整体分布情况。
综上所述,对于鸢尾花数据集,LDA在保留类别信息和类别区分方面表现出色,而PCA则更适合用于数据的展示和压缩。根据具体任务需求,我们可以选择适合的降维算法来获得最佳的数据表示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

70+页实战经验分享,《研发效能红宝书》重磅发布 | 附下载

研发效能提升方法从来没有标准答案,不同角色的人,以不同的目标搭建效能体系的方法千差万别,但又存在互通之处。所以做研发效能更需要多方借鉴,然后因地制宜,找到适合自己的方式。于是,我们汇集业界多位效能…

shell脚本解析 01

一、shell 概述 1.shell 的两层含义: 既是一种应用程序,又是一种程序设计语言 a.作为应用程序: 交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能。称之为 shell 命令解析器。shell 是用户和…

DreamBooth论文解读

文章目录 摘要问题算法3.1 文生图扩散模型3.2 个性化文生图模型3.3 特定类别先验保留损失 实验评估方式比较消融实验PPL类别先验 应用限制 结论 论文: 《DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation》 project&#xf…

yueyin uart ip 使用说明文档

目录 1 概述2 IP功能3 IP端口4 收发数据时序4.1 Uart_tx接口4.2 Uart_rx接口5 获取IP地址 1 概述 本文用于讲解yueyin IP 的uart ip(串口/rs422/rs485/rs232)的功能,以及使用说明,方便使用者快速上手。 版本:V1.0.0 编…

行业报告 | 清华大学AIGC发展研究1.0震撼发布!(技术+未来篇)

文 | BFT机器人 01 技术篇 深度学习进化史:知识变轨 风起云涌 已发生的关键步骤: 人工神经网络的诞生 反向传播算法的提出 GPU的使用 大数据的出现 预训练和迁移学习 生成对抗网络 (GAN) 的发明 强化学习的成功应用 自然语言处理的突破 即将发生的关键步骤…

基于matlab对传感器阵列中的扰动和元件故障进行建模(附源码)

一、前言 本示例展示了如何对传感器阵列中的幅度、相位、位置和模式扰动以及晶片故障进行建模。 二、振幅扰动 本节介绍如何在 10 个晶片的均匀线性阵列 (ULA) 上添加增益或幅度扰动。将扰动视为统计上独立的零均值高斯随机变量,标准差为 0.1…

Linux内核进阶----整体框架及子系统概览

目录 1、概述 2、核心抽象及设计选型 2.1. 对进程和内核的抽象 2.2. 对进程地址空间的抽象 2.3. 支持可重入可抢占的内核 2.4. 放松管控与努力回收 2.5. 单块结构内核动态加载模块 2.6. 为系统中的一切活动打拍子 2.7. 一切皆文件的理念 3、Linux整体架构模块说明 3.…

Pnpm实现Monorepo风格项目搭建

Monorepo是什么 与Monorepo对比的是MutiRepo。对于一个复杂的前端架构通常会有多个npm package组成。repo指的是版本仓库。如果多个package放在一个repo仓库中就叫做monorepo。 目前有不少大型开源项目采用了这种方式,如 Babel,React, Meteor, Ember, …

基于Hexo和Butterfly创建个人技术博客,(12) 定制化博客站点高级功能,如搜索、在线聊天、自定义样式等

Butterfly官方网站,请 点击进入 部分特效来源于网站的总结,请点击进入 本章目标: 选择自己需要的内容,然后加以实现。本文中涉及的修改方式主要包含三种:1、修改源码;2、扩展源码;3、添加插件&a…

项目进度延误怎么办?给项目经理的6个处理提示

有研究调查称,只有2.5%的企业能100%成功完成他们的项目。影响项目成功的因素有很多,但对项目生产力造成严重损失的一个重要方面是项目延误。 无论是同事请病假,还是客户想要返工,许多事情都可能导致项目延误。当发生这些情况&…

桥梁监测系统多少钱?桥梁监测系统组成部分有哪些?

桥梁作为大多数城市和国家的重要设施,为居民提供了交流和沟通的纽带。然而,随着时间的推移、超荷载的运输和不间断的环境影响,桥梁的状态日益恶化。为了更好的了解桥梁的结构状态,保障桥梁的安全性和可靠性,桥梁监测系…

SQL注入第二章节MYSQL手工注入

SQL注入第二章节MYSQL手工注入 2.1 SQL注入之sqli-labs环境搭建 一、SQLi-Labs是什么? SQLi-Labs是一个专业的SQL注入练习平台,适用于GET和POST场景,包含了以下注入: 基于错误的注入(Union Select) 字符…

信息论/python笔记: 最大信息系数 MIC

1 互信息 sklearn 笔记整理:sklearn.metrics_sklearn中的mean absolute percentage error_UQI-LIUWJ的博客-CSDN博客 2 最大信息系数(MIC,Maximal Information Coefficient) 2.1 方法介绍 衡量两个变量X和Y之间的关联程度&…

知识蒸馏的说明

本文参考: ChatGPT 温度系数t与top-p, 超参怎么设置最优? - 知乎 知识蒸馏系列(一):三类基础蒸馏算法_OpenMMLab的博客-CSDN博客 知识蒸馏算法汇总 - 知乎 知识蒸馏__Old_Summer的博客-CSDN博客 目录 1、 ChatGPT…

一文弄懂mysql事务

首先,什么是事务呢? 事务就是由单独单元的一个或多个sql语句组成, 在这个单元中, 每个sql的语句都是相互依赖的, 而整个单独单元作为一个不可分割的整体存在, 类似于物理当中的原子(一种不可分割的最小单位) 通俗的来讲就是, 事务就是一个整体, 里面的内容要么都执行成功, 要…

大学生找工作的个人简历模板(合集)

大学生找工作的个人简历模板1 个人基本简历 姓名:-国籍:中国 目前所在地:__ 民族:汉族 户口所在地:__ 身材: 婚姻状况:未婚年龄:__岁 培训认证:诚信徽章: 求职…

swagger 入门指南

1. 写在最前面 最近在负责的服务,出现了客户接二连三的投诉 api 参数难以理解的问题。本着从「根本上解决问题」的思路,笔者思考了以下方案: 简化难以理解的参数,重新设计一版 api 优化 api 文档,更易于用户理解 1…

代码随想录算法训练营第四十一天| 343. 整数拆分、96.不同的二叉搜索树

整数拆分 题目链接:力扣 确定dp数组(dp table)以及下标的含义 dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。确定递推公式 然后有两种渠道得到dp[i]: 一个是j * (i - j) 直接相乘。 一个是j * d…

unit4

目录 carpenterovertakeremainderobjectivepasturedespitegulfshepherdinteriorchorusoppressgrinprofessionalresistantfosterleapembarkneutralelasticcirculateintimidatechopprimarystirappraisallayoutsurvivalentertainmoanlocatepublishpacehearingexplosivecricketvolt…

stable-diffusion-webui 快捷安装教程

简介 stable-diffusion-webui 是一个用来装载Stable Diffusion 模型的网页,可以方便的调用模型生成图片。 stable-diffusion-webui的github地址为:https://github.com/AUTOMATIC1111/stable-diffusion-webui 这个库的依赖很多,虽然代码里面有…