《机器学习》—— PCA降维
文章目录
- 一、PCA降维简单介绍
- 二、python中实现PCA降维函数的介绍
- 三、代码实现
- 四、PCA降维的优缺点
一、PCA降维简单介绍
- PCA(主成分分析,Principal Component Analysis)是一种常用的数据降维技术。
- 它通过线性变换将原始数据转换到新的坐标系统中,使得任何投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依此类推。
- PCA的主要目的是通过保留数据集中对方差贡献最大的特征来降低数据的维度,同时尽可能保留原始数据的信息。
- PCA降维的步骤:
- 1、标准化数据:
由于PCA对数据的尺度非常敏感,因此在进行PCA之前,通常需要先将数据标准化(也称为归一化),即每个特征减去其均值并除以其标准差,使得每个特征的均值为0,方差为1。 - 2、计算协方差矩阵:
协方差矩阵衡量的是数据集中各个特征之间的相关性。对于n维数据,其协方差矩阵是一个n×n的矩阵,其中每个元素C ij是第i个特征和第j个特征的协方差。 - 3、计算协方差矩阵的特征值和特征向量:
特征值表示了每个主成分在数据集中的方差贡献率,而特征向量则定义了新的坐标轴的方向。 - 4、选择主成分:
根据特征值的大小,选择前k个最大的特征值对应的特征向量。这些特征向量将构成新的特征空间,其中k是降维后的维度数。 - 5、将原始数据投影到新的特征空间:
使用选定的特征向量作为基,将原始数据投影到新的特征空间,得到降维后的数据。
- 1、标准化数据:
二、python中实现PCA降维函数的介绍
-
在Python中,使用scikit-learn库来进行PCA分析,其中PCA是通过PCA类来实现的
-
PCA类有以下参数(默认值)
PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None) -
重要参数的介绍:
-
n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。
- 如果为整数,表示要降维到的目标,比如十维的数据,指定n_components=5,表示将十维数据降维到五维;
- 如果为小数,表示累计方差百分比。
-
copy : bool类型,True或者False,缺省时默认为True。 表示是否在运行算法时,将原始训练数据复制一份。
- 若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;
- 若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
-
whiten:判断是否进行白化。
- 所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化。
-
svd_solver:即指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。有4个可以选择的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。
- randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。
- full则是传统意义上的SVD,使用了scipy库对应的实现。
- arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现。
- auto是默认值,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。
-
一些返回值属性
- components_:一个形状为(n_components, n_features)的NumPy数组,包含了定义主成分的特征向量(即每个主成分是原始特征的哪个线性组合)。
- explained_variance_:一个形状为(n_components,)的NumPy数组,包含了每个主成分解释的方差值。方差值越大,则说明越是重要的主成分。
- explained_variance_ratio_:一个形状为(n_components,)的NumPy数组,包含了每个主成分解释的方差占总方差的比例。
三、代码实现
-
数据集介绍
- 此数据集是一份少量的(60+)鸢尾花数据,前四列为特征数据,最后一列为标签数据
- 部分数据如下所示

-
此数据中有四个特征,代表的有4个维度,下面将通过PCA降维方法将其降维至2维,并将降维后的特征数据划分为新的数据集,传入到逻辑回归模型中进行训练与测试
-
并将没有进行PCA降维处理的原数据也传入到回归模型中,得出结果,进行比较
-
代码如下
from sklearn.decomposition import PCA import pandas as pd# 读取数据 data = pd.read_excel('hua.xlsx')# 数据划分 x = data.iloc[:, :-1] # 训练数据 y = data.iloc[:, -1] # 标签数据# 实例化PCA对象 pca = PCA(n_components=2) pca.fit(x)print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_))) print('每个主成分的方差值:{}'.format(pca.explained_variance_))new_x = pca.transform(x) print('PCA降维后数据:') print(new_x)# 切分降维后的数据集 from sklearn.model_selection import train_test_splitx_train_pca, x_test_pca, y_train_pca, y_test_pca = \train_test_split(new_x, y, test_size=0.2, random_state=0)from sklearn.linear_model import LogisticRegression# 实例一个逻辑回归模型 classifier_pca = LogisticRegression() classifier_pca.fit(x_train_pca, y_train_pca) # 训练数据from sklearn import metrics# accuracy 值 train_score_pca = classifier_pca.score(x_train_pca, y_train_pca) print("训练集数据测试的accuracy值为:{}".format(train_score_pca)) # 训练集数据评估指标报告 train_predict_pca = classifier_pca.predict(x_train_pca) print("训练集数据评估指标报告") print(metrics.classification_report(y_train_pca, train_predict_pca))test_score_pca = classifier_pca.score(x_test_pca, y_test_pca) print("测试集数据测试的accuracy值为:{}".format(test_score_pca)) # 测试集数据评估指标报告 test_predict_pca = classifier_pca.predict(x_test_pca) print("测试集数据评估指标报告") print(metrics.classification_report(y_test_pca, test_predict_pca))print("**************************************************************")# 切分原始数据集 x_train, x_test, y_train, y_test = \train_test_split(x, y, test_size=0.2, random_state=0)classifier = LogisticRegression() classifier.fit(x_train, y_train)# accuracy 值 train_score = classifier.score(x_train, y_train) print("训练集数据测试的accuracy值为:{}".format(train_score)) # 训练集数据评估指标报告 train_predict = classifier.predict(x_train) print("训练集数据评估指标报告") print(metrics.classification_report(y_train, train_predict))test_score = classifier.score(x_test, y_test) print("测试集数据测试的accuracy值为:{}".format(train_score)) # 测试集数据评估指标报告 test_predict = classifier.predict(x_test) print("测试集数据评估指标报告") print(metrics.classification_report(y_test, test_predict)) -
结果如下


-
由于此数据集的数据量太少,降维前后的模型训练结果基本差不多,在大的数据集中对比最终的结果可能会更加明显
四、PCA降维的优缺点
- 优点:
- 1.计算方法简单,容易实现。
- 2.可以减少指标筛选的工作量。
- 3.消除变量间的多重共线性。
- 4.在一定程度上能减少噪声数据。
- 缺点:
- 1.特征必须是连续型变量(可以在一定范围内连续取值的变量)。
- 2.无法解释降维后的数据是什么。
- 3.有时候贡献率小的成分有可能更重要,但是会被降维的时候舍弃掉。
相关文章:
《机器学习》—— PCA降维
文章目录 一、PCA降维简单介绍二、python中实现PCA降维函数的介绍三、代码实现四、PCA降维的优缺点 一、PCA降维简单介绍 PCA(主成分分析,Principal Component Analysis)是一种常用的数据降维技术。它通过线性变换将原始数据转换到新的坐标系…...
植物三萜皂苷生物合成途径及调控机制研究进展-文献精读48
摘要 三萜皂苷(triterpenoids saponins)是由三萜皂苷元和一个或多个糖基和/或其他化学基团缩合而成的一系列结构多样的天然化合物[1], 主要分布在五加科、蝶形花科、石竹科、桔梗科、毛茛科、玄参科、葫芦科等植物中[2]. 植物中三萜皂苷常分布在特定的器官和组织, 如人参(Pana…...
server 2016搭建FTP服务
目录 一、实验环境 二、在server 2016上面安装FTP服务 三、在server 2016上面配置FTP服务 四、创建用户(也可创建用户组,给用户组赋予权限) 一、实验环境 windows server 2016用于安装ftp服务 windows 10作为客户端进行测试。 二、在s…...
物理学基础精解【4】
文章目录 运动和力质点运动机械运动的参考系运动的相对性运动学中坐标系 参考文献 运动和力 质点运动 一个物体相对于另一个物体的位置或一个物体的某些部分相对于其他部分的位置 ,随着时间而变化的过程,叫机械运动 。质点是一个物理学中的理想化模型&…...
【区块链 + 人才服务】Blockchain Workshop- 区块链编程实践平台 | FISCO BCOS应用案例
Blockchain Workshop v2.0(以下简称 BCW v2.0)是点宽网络科技有限公司升级的全新区块链实践教育平台产品。 BCW v2.0 区块链实践教育平台面向高校区块链专业人才培养,用于区块链专业技术学习和智能合约编程学习,平台基于 FISCO BC…...
Java面试篇基础部分-Java中常用的I/O模型
阻塞I/O模型 阻塞式的I/O模型是一种非常常见的I/O模型机制,在进行数据读写操作的时候,客户端会发生阻塞等待。 工作流程如图所示,该用户线程一直阻塞,等待内存中的数据就绪;内存中的数据就绪之后,内核态的数据将拷贝到用户线程中,并且返回I/O的执行结果到用户线程。这个…...
如何使用python运行Flask开发框架并实现无公网IP远程访问
文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程语…...
第三届828 B2B企业节开幕,大腾智能携手华为云共谱数字化新篇章
8月27日,由华为携手上万家伙伴共同发起的第三届828 B2B企业节在贵州正式开幕。 本届企业节推出上万款数智产品,600多个精选解决方案,旨在融通数智供需,加速企业智改数转,助推中国数智产业实力再升级。中共贵州省委副书…...
Linux网络编程IO管理
网络 IO 涉及到两个系统对象,一个是用户空间调用 IO 的进程或者线程,一个是内核空间的内核系统,比如发生 IO 操作 read 时,它会经历两个阶段: 等待内核协议栈的数据准备就绪;将内核中的数据拷贝到用户态的…...
SpringCloud集成ELK
1、添加依赖 <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>6.1</version> </dependency>2、在logback-spring.xml中添加配置信息(logback-sp…...
【卷起来】VUE3.0教程-06-组件详解
各位看官,点波关注和赞吧 组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构: 这和我们嵌套 HTML 元素的方式类似,Vue 实现了自己的…...
JS Web
Web API 元素通用属性 元素自身属性 事件处理...
【Linux】传输层协议——UDP
零、传输层的作用是负责数据能够从发送端传输到接收端 一、再来认识一下端口号 端口号(Port)标识了一个主机进行通信的不同的应用程序。在TCP/IP协议中,用“源IP”,“源端口号”,“目的IP”,“目的端口号”…...
算法学习攻略总结 : 入门至进阶,通关之路指南
❃博主首页 : <码到三十五> ☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 : <搬的每块砖,皆为峰峦之基;公众号搜索(码到…...
《卷积神经网络 CNN 原理探秘》
CNN基本原理详解 卷积神经网络(Convolutional Neural Network,简称CNN),是一种前馈神经网络,人工神经元可以响应周围单元,可以进行大型图像处理。卷积神经网络包括卷积层和池化层。 卷积神经网络是受…...
C#获取计算机信息
目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management; n…...
派遣函数 - 通过设备链接打开设备
利用文件IO相关的Wn32API对设备进行“打开”和“关闭”操作。要打开设备,必须通过设备的名字才能得到该设备的柄。前面介绍过,每个设备都有设备名称,如HelloDDK驱动程序的设备名为“Device\\MyDDKDevice”,但是设备名无法被用户模…...
Vue 2 中的 `$set` 方法详解
在 Vue 2 中,响应式数据的更新非常重要,因为它确保了当数据改变时,视图能够自动更新。Vue 使用一套高效的机制来追踪依赖并在数据变化时更新视图。然而,在某些情况下,直接修改对象的属性可能不会触发视图更新。这时&am…...
掌握Hive函数[2]:从基础到高级应用
目录 高级聚合函数 多进一出 1. 普通聚合 count/sum... 2. collect_list 收集并形成list集合,结果不去重 3. collect_set 收集并形成set集合,结果去重 案例演示 1. 每个月的入职人数以及姓名 炸裂函数 概述 案例演示 1. 数据准备 1)表…...
水壶问题记录
https://leetcode.cn/problems/water-and-jug-problem/description/?envTypestudy-plan-v2&envId2024-spring-sprint-100...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
