当前位置: 首页 > news >正文

基于PCA与LDA的数据降维实践

基于PCA与LDA的数据降维实践

描述

数据降维(Dimension Reduction)是降低数据冗余、消除噪音数据的干扰、提取有效特征、提升模型的效率和准确性的有效途径, PCA(主成分分析)和LDA(线性判别分析)是机器学习和数据分析中两种常用的经典降维算法。

本任务通过两个降维案例熟悉PCA和LDA降维的原理、区别及调用方法。

源码下载

环境

  • 操作系统:Windows 10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库列表

    matplotlib   	3.3.4
    scikit-learn	0.24.2
    

分析

任务1、基于PCA算法实现鸢尾花数据集降维,涉及下列三个环节:

A)加载鸢尾花(Iris)数据并进行降维

B)降维后的数据可视化

C)使用K-NN算法进行分类,对比降维前后的分类准确性

任务2、基于LDA算法实现红酒数据集降维,涉及以下四个环节:

A)加载红酒数据集

B)使用PCA和LDA两种算法对数据进行降维

C)降维结果可视化

D)降维前后的分类准确性对比

实施

1、基于PCA算法实现鸢尾花数据集降维

鸢尾花数据原有四个特征维度,运用PCA算法将特征维度降为两个,之后进行可视化并运用K-NN算法进行分类,对比降维前后的分类准确性(数据降维的目的之一是提升模型的准确性)。

1.1 加载鸢尾花特征数据,并使用PCA算法降维

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier# 加载鸢尾花数据集
iris= load_iris()
data = iris.data # 特征数据
target = iris.target # 标签数据
print(data.shape) # 查看数据维度(150, 4)# PCA降维
pca = PCA(n_components = 2).fit(data) # 利用PCA算法降成2维
new_data = pca.transform(data)
print(new_data.shape) # 查看数据维度(150,2)

结果如下:

(150, 4)
(150, 2)

可以看到,鸢尾花数据由四维(四个特征)降为两维度。

1.2 数据可视化,并使用K-NN算法对比降维前后的分类准确性

# 降维后的数据集可视化
plt.title('Iris dimensions reduction: 4 to 2')
plt.scatter(new_data[:, 0], new_data[:, 1], c=target)
plt.show()# 使用KNN算法对比降维前后分类的准确性
model = KNeighborsClassifier(3)
score = model.fit(data, target).score(data, target)
print('4-dims:', score)
score = model.fit(new_data, target).score(new_data, target)
print('2-dims:', score)

输出结果:

请添加图片描述

结果分析:

数据从4维降到2维后,可以很方便地进行可视化。从散点图中直观地看,降维后的数据较好地保留了原数据的分布信息。另外可以看到,降维后的KNN分类模型准确性有所提升,这也是数据降维的目的之一。

2、基于LDA算法实现红酒数据集降维

红酒数据集(Wine)有13个特征(即13个维度),我们分别使用PCA和LDA算法对数据集进行降维(降成2维),之后使用逻辑回归(LogisticRegression)分别在LDA算法降维前后的数据集上建立分类模型,对比同一种模型在数据集降维前后的准确性,直观感受数据降维对模型准确性的影响。

2.1 加载红酒数据集

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis 
from sklearn.datasets import load_wine# 加载红酒数据集
wine= load_wine()
data = wine.data
target = wine.target
print(data.shape) # 查看数据维度

2.2 分别使用LDA和PCA算法进行降维

# PCA降维(无类别)
pca = PCA(n_components = 2).fit(data) # 利用PCA算法降成2维
data_pca = pca.transform(data) # 降维转换
print('PCA:', data_pca.shape) # 查看数据维度# LDA降维(有类别,考虑样本标签)
lda = LinearDiscriminantAnalysis(n_components=2).fit(data, target)
data_lda = lda.transform(data)
print('LDA:', data_lda.shape)

结果如下:

(178, 13)
PCA: (178, 2)
LDA: (178, 2)

可以看到,两种算法都将红酒数据集由13维降成2维。

2.3 降维结果可视化

数据降到2维后,可以很方便地用散点图进行可视化,下面分别将两种算法降维后的红酒数据集进行可视化,对比其分布情况。

# LDA算法更适合有标签数据的降维
# 下面将两种方法降维后的数据进行可视化
fig = plt.figure(figsize=(12, 4)) # 生成画板# PCA降维结果
ax1 = fig.add_subplot(1, 2, 1) # 添加子图1
ax1.set_title('PCA')
ax1.scatter(data_pca[:, 0], data_pca[:, 1], c=target)# LDA降维结果
ax2 = fig.add_subplot(1, 2, 2) # 添加子图2
ax2.set_title('LDA')
ax2.scatter(data_lda[:, 0], data_lda[:, 1], c=target)plt.show() # 显示图像

显示结果:

请添加图片描述

可以看到,LDA降维因为考虑到了样本的类别标签信息,降维后的数据分布能够较好地将类型分开。

2.4 LDA降维前后的分类准确性对比

使用逻辑回归算法,对LDA降维前后的数据集建立分类模型,对比其准确性。

from sklearn.model_selection import  train_test_split
from sklearn.linear_model import LogisticRegression# 1、使用逻辑回归模型,在降维前的数据集上训练并评估
X_train, X_test, y_train, y_test = train_test_split(data, target, random_state=0)model = LogisticRegression().fit(X_train, y_train)
score = model.score(X_test, y_test) # 在测试集上评估分类准确性
print(score)# 2、在LDA降维后的数据集上训练并评估
X_train, X_test, y_train, y_test = train_test_split(data_lda, target, random_state=0)
model = LogisticRegression().fit(X_train, y_train)
score = model.score(X_test, y_test) # 在测试集上评估分类准确性
print(score)

结果如下:

0.9333333333333333
1.0

可以看到,使用LDA降维后的数据建模,分类准确性有所提升。

相关文章:

基于PCA与LDA的数据降维实践

基于PCA与LDA的数据降维实践 描述 数据降维(Dimension Reduction)是降低数据冗余、消除噪音数据的干扰、提取有效特征、提升模型的效率和准确性的有效途径, PCA(主成分分析)和LDA(线性判别分析&#xff0…...

【Hello Network】网络编程套接字(一)

作者:小萌新 专栏:网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍网络的基础概念 网络编程套接字(一) 预备知识源ip和目的ip端口号TCP和UDP协议网络中的字节序 socket编程接口socket常…...

【计算机网络】学习笔记:第二章 物理层(五千字详细配图)【王道考研】

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...

直流有刷电机的电路分析

这里写目录标题 H桥改进后的电路L298N原理图野火的电机驱动板MOS管野火的原理图 H桥 当 Q1 和 Q4 导通时&#xff0c;电流将经过 Q1 从左往右流过电机&#xff0c;在经过 Q4 流到电源负极&#xff0c;这时图中电机可以顺时针转动。 当 Q3 和 Q2 导通时&#xff0c;电流将经过 Q…...

使用PowerShell自动部署ASP.NetCore程序到IIS

asp.net core 安装asp.net core sdk https://dotnet.microsoft.com/en-us/download/dotnet/3.1 创建asp.net core项目 dotnet new webapi运行项目 访问https://localhost:5001/WeatherForecast iis配置 安装iis 以管理员身份运行powershell Enable-WindowsOptiona…...

Elasticsearch:保留字段名称

作为 Elasticsearch 用户&#xff0c;我们从许多不同的位置收集数据。 我们使用 Logstash、Beats 和其他工具来抓取数据并将它们发送到 Elasticsearch。 有时&#xff0c;我们无法控制数据本身&#xff0c;我们需要管理数据的结构&#xff0c;甚至需要在摄取数据时处理字段名称…...

Qt 套接字类(QTcpSocket和QUdpSocket)解密:迈向 Qt 网络编程之巅

Qt 套接字类解密&#xff1a;迈向 Qt 网络编程之巅 一、套接字类简介&#xff08;Introduction to Socket Classes&#xff09;# 套接字类的作用&#xff08;Role of Socket Classes&#xff09;Qt 中常见套接字类概述&#xff08;Overview of Common Socket Classes in Qt&…...

Python视频编辑库:MoviePy

MoviePy MoviePy是一个关于视频编辑的python库,主要包括:剪辑,嵌入拼接,标题插入,视频合成(又名非线性编辑),视频处理,和自定制效果。可以看gallery中的一些实例来了解用法。MoviePy可以读写所有的音频和视频格式,包括GIF,通过python2.7+和python3可以跨平台运行于window/M…...

课程3:ASP.NET Core 身份验证 - Cookie

课程简介目录 🚀前言一、.Net Core 身份验证简介二、开启Cookie身份验证三、添加登录接口3.1 添加登录Dto3.2 添加登录接口Login3.3 获取用户信息接口,添加身份验证四、获取用户信息接口测试4.1 测试获取用户信息接口4.2 登录4.3 再次测试:获取用户信息接口4.4 其他浏览器测…...

Visual Studio 2022如何安装和使用MSDN

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;在后台收到提问&#xff0c;问我Visual Studio 2022如何安装和使用MSDN&#xff0c;这个我之前也没有在这个版本上装过MSDN&#xff0c;我之前是在Visual Studio 2017版上装过MSDN&#xff0c;那既然有人问了…...

82.qt qml-2D粒子系统、粒子方向、粒子项(一)

由于粒子系统相关的类比较多, 所以本章参考自QmlBook in chinese的粒子章节配合学习: 由于QmlBook in chinese翻译过来的文字有些比较难理解,所以本章在它的基础上做些个人理解,建议学习的小伙伴最好配合QmlBook in chinese一起学习。 1.介绍 粒子模拟的核心是粒子系统(Partic…...

引用的底层原理(汇编指令),引用与指针的联系与区别

TIPS 2. 3. 4. 引用的底层本质 在语法层面上的话&#xff0c;这个引用是不开空间的&#xff0c;相当于是对一个变量进行一个取别名的这么一个操作。在底层实现上实际是有空间的&#xff0c;因为引用是按照指针方式来实现的。然而如果你从底层的角度去看的话&#xff0c;因…...

磁盘的移臂调度算法

1、概要 访问磁盘&#xff0c;首先要找到数据&#xff0c;但机械硬盘并不是直接电子读取&#xff0c;是需要移动磁头到相应的数据块上才能读取的&#xff0c;即需要磁头移动到目标柱面(磁道)&#xff0c;然后磁片旋转使磁头能访问到相应扇区&#xff0c;进而读取到数据。 根据访…...

软考第六章 网络互连与互联网

网络互连与互联网 1.网络互连设备 组成因特网的各个网络叫做子网&#xff0c;用于连接子网的设备叫做中间系统。它的主要作用是协调各个网络的工作&#xff0c;使得跨网络的通信得以实现。 网络互连设备可以根据它们工作的协议层进行分类&#xff1a; 中继器&#xff1a;工…...

C6678-缓存和内存

C6678-缓存和内存 全局内存映射扩展内存控制器&#xff08;XMC&#xff09;-MPAX内存保护与地址扩展使用例程缓存 全局内存映射 扩展内存控制器&#xff08;XMC&#xff09;-MPAX内存保护与地址扩展 每个C66x核心都具有相同大小的L1和L2缓存&#xff0c;并且可配置为普通内存使…...

实操| 前端新人无敲代码开发APP

作为一种大型的基于GPT-3. 5结构的语言模型&#xff0c;ChatGPT由OpenAI训练&#xff0c;采用深度学习技术&#xff0c;通过大量的文本数据学习&#xff0c;可以生成类似于人类自然语言的文字。ChatGPT是一种非常强大的对话引擎&#xff0c;能进行对话、回答问题和完成任务。Ch…...

OpenCV图像处理之傅里叶变换

文章目录 OpenCV图像处理之傅里叶变换图像处理之傅里叶变换流程图OpenCv图像处理之傅里叶变换OpenCv傅里叶变换之低通滤波OpenCv傅里叶变换之高通滤波 OpenCV图像处理之傅里叶变换 傅里叶变换&#xff1a;目的就是得到图像的低频和高频&#xff0c;然后针对低频和高频进行不同…...

Docker网络案例

bridge 是什么 Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机…...

Java实验课的学习笔记(二)类的简单使用

本文章就讲的是很基础的类的使用 重点大概就是类的构造函数以及一些很基础的东西。 实验内容是些老生常谈的东西&#xff0c;Complex类&#xff0c;在当初学C面向对象的时候也是这个样子展开的。 内容如以下&#xff1a; public class Complex {float real;float imag;public…...

实战案例|聚焦攻击面管理,腾讯安全威胁情报守护头部券商资产安全

金融“活水”润泽千行百业&#xff0c;对金融客户来说&#xff0c;由于业务场景存在特殊性和复杂性&#xff0c;网络安全必然是一场“持久战”。如何在事前做好安全部署&#xff0c;构建威胁情报分析的防护体系至为重要&#xff0c;实现更为精准、高效的动态防御。 客户名片 …...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...