基于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降维后的数据建模,分类准确性有所提升。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

状态错误 MSB8040,此项目需要缓解了 Spectre 漏洞的库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体

“Spectre Mitigation”缓解错误 如果出现“Spectre Mitigation”这种错误,就要了解下PIPE技术:流水线技术,比如3级流水线,避免CPU空闲,不浪费时间,但是前提是没有跳转,指令都是顺序执行的&…

3.9、互斥锁(互斥量)

3.9、互斥锁(互斥量)1.互斥锁(互斥量)的介绍2. 互斥量相关操作函数3.互斥量函数的使用介绍①pthread_mutex_init②pthread_mutex_destroy③pthread_mutex_lock④pthread_mutex_trylock⑤pthread_mutex_unlock3.利用互斥锁实现线程…

王小川,才是深「爱」李彦宏的那个人?

在推出中国首个类ChatGPT产品「文心一言」后,李彦宏在接受专访时断言,中国基本不会再出一个OpenAI了,「创业公司重新做一个ChatGPT其实没有多大意义,基于大语言模型开发应用机会很大,没有必要再重新发明一遍轮子。」 听…

SPARQL endpoint with Ontop CLI部署,python使用SPARQLWrapper

Ontop CLI部署,避免踩坑0.前言1.提示2.详细部署流程3.python操作4.碎碎念0.前言 教程:Setting up an Ontop SPARQL endpoint with Ontop CLI照着教程来,不知道为啥,总是报错,后来发现,手机搜到的跟电脑不一…

pytorch 数据类型

文章目录一、tensor如何表示字符串数据类型类型判断Dimension 0Dimension 1Dimension 2Dimension 3Dimension 4mixed二、创建Tensorimport from numpyimport from listuninitialized 未初始化set default typerand/rand_like, randintfulllinspaceindex切片三、维度变换总结一、…

尚硅谷大数据技术Scala教程-笔记04【集合】

视频地址:尚硅谷大数据技术之Scala入门到精通教程(小白快速上手scala)_哔哩哔哩_bilibili 尚硅谷大数据技术Scala教程-笔记01【Scala课程简介、Scala入门、变量和数据类型、运算符、流程控制】尚硅谷大数据技术Scala教程-笔记02【函数式编程】…

交换机Access模式和Trunk模式配置演示

一.Access配置 1.创建VLAN 2.设置为接口模式,将接口划入不同VLAN 3.测试 二.Trunk配置 1. 接口VLAN配置 2.设置允许VLAN流量通过,可写all 3.测试 一.Access配置 实现VLAN10 和 VLAN20之间通信隔离 1.创建VLAN [s1]vlan 10 [s1]vlan 20[s1]vlan…

Android中的AsyncTask

近期写了一个项目,在前台刷新界面的时候需要操作数据库,进行数据操作,在UI线程更新数据会导致ANR,程序十分卡,因此用了AsyncTask进行后台数据处理。 介绍 AsyncTask是一个用于在后台线程执行异步任务并在主线程更新U…

set/multiset容器

1、set/multiset容器简介 但是 set 容器只有键值,在插入数据的时候会自动根据 键值 进行排序,所以不允许有相同的键值存在,也不能修改 set 容器元素值,会破坏 set 的数据结构。set 容器的迭代器是只读迭代器 2、set容器 API 操作…

读懂AUTOSAR :DiagnosticLogAndTrace DLT(四)-- API解析

一、周期调用的函数:Dlt_TxFunction 根据参数DltGeneralTrafficShapingSupport,决定如何去发送DLT消息。如果为TRUE,那需要参考参数DltLogChannelTrafficShapingBandwidth为每个Log通道设置发送带宽;如果为FALSE,那么…

纯虚函数和抽象类

什么时候使用纯虚函数: 某些类,在现实角度和项目实现角度,都不需要实例化(不需要创建它的对象),这个类中定义的某些成员函数,只是为了提供一个形式上的借口,准备让子类来做具体化的实现,此时,这个方法就可以定义为"纯虚函数",包含纯虚函数的类,就称为抽象类. 纯虚函…

Java入坑之集合、流与序列化

一、集合 1.1集合定义 集合概念: 保存和盛装数据的容器,将许多元素组合成一个单一单元的容器对象。集合,可用于存储/检索/操作/传输/聚合数据集合框架: 表示和操作集合的体系,包括接口、实现类,集合框架的…

python真的如此好吗?

作为一名合格的(准)程序员,必做的一件事是关注编程语言的热度,编程榜代表了编程语言的市场占比变化,它的变化更预示着未来的科技风向和机会! Python霸占榜首 只因它真的很强 Python,年龄可能比…

这篇文章价值很大:股票历史分时成交数据怎么简单获取?【干货】

文章目录前言一、准备二、使用步骤1.引入库2,使用这个API查询历史分时数据:3.查询完整历史分时数据4.其他查询方法参数格式:[(市场代码, 股票代码), ...]参数:市场代码, 股票代码, 文件名, 起始位置, 数量参数:市场代码…

MySQL-binlog+dump备份还原

目录 🍁binlog日志恢复 🍂binlog介绍 🍂Binlog的用途 🍂开启binary log功能 🍂配置binlog 🍁mysqldump 🍂数据库的导出 🍂数据库的导入 🍁mysqldumpbinlog 🦐…

【Python_Scrapy学习笔记(一)】Scrapy框架简介

Scrapy框架简介 前言 Scrapy 框架是一个用 python 实现的为了爬取网站数据、提取数据的应用框架,使用 Twisted 异步网络库来处理网络通讯,可以高效的完成数据爬取。本文主要介绍 Scrapy 框架的构成与工作原理。 正文 1、Scrapy安装 Windows安装&…

引导程序、BIOS中断、检测内存容量、实模式切换到保护模式

初始化引导程序 基本概念 BIOS会将磁盘的第0个扇区(大小为512字节),加载到0x7c00处。 引导程序负责操作系统的加载,主要用于为操作系统运行提供初始化环境,并运行加载操作系统。 BIOS只加载磁盘的第0个扇区(512字节)到内存中,次程…

笔记本电脑开不了机?3种解决方法

案例:笔记本电脑开不了机怎么办? 【我的笔记本电脑一直用得好好的,今天突然开不了机,尝试按了开机键很多次也没有解决。有人遇到过同样的问题吗?有没有解决的方法!】 在日常生活中,我们经常会…

【计算机网络——计算机网络的概念,组成,功能和分类以及相关的性能指标,分层结构和协议,TCP/IP参考模型】

文章目录计算机网络体系结构计算机网络的概念、组成、功能和分类标准化工作及相关组织速率相关的性能指标时延、时延带宽积、PTT和利用率分层结构、协议、接口和服务OSI参考模型TCP IP参考模型计算机网络体系结构 计算机网络的概念、组成、功能和分类 计算机网络的概念 计算…

游戏内嵌社区服务开放,助力开发者提升玩家互动与留存

华为 HMS Core 游戏内嵌社区服务提供快速访问华为游戏中心论坛能力,支持玩家直接在游戏内浏览帖子和交流互动,助力开发者扩展内容生产和触达的场景。 一、为什么要游戏内嵌社区? 二、游戏内嵌社区的典型使用场景 1、游戏内打开论坛 您可以在…