Python主成分分析实现方法详解
哈喽!今天心血来潮给大家带来了《Python实现主成分分析方法详解》,想必大家应该对文章都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习文章,千万别错过这篇文章~希望能帮助到你!
PCA的原理是通过正交变换将相关变量转换为线性无关的主成分,以保留数据最大方差方向实现降维。1. 主成分是原始特征的线性组合,按方差从大到小排列;2. 降维时选择前k个主成分以保留足够信息;3. 数据需标准化处理以避免特征尺度影响;4. 主要作用包括去除冗余、提升模型效率、可视化及去噪。局限包括:1. 假设数据线性相关,不适用于非线性结构;2. 对异常值敏感;3. 主成分缺乏可解释性;4. 忽略低方差但可能重要的特征;5. 降维效果依赖标准化预处理。适用场景为数据线性相关、无需特征可解释性、无显著异常值且特征多的情况下使用。
用Python实现数据的主成分分析(PCA)通常依赖于科学计算库,其中scikit-learn
是最常用也最方便的选择。它提供了一个直观的接口来执行这项任务,核心思想就是找到数据中方差最大的几个方向,将高维数据投影到这些低维空间上,从而达到降维的目的。

解决方案
要用Python实现PCA,最直接的方法是使用sklearn.decomposition
模块里的PCA
类。整个过程大致分为数据准备、实例化PCA模型、拟合数据和转换数据这几步。
首先,确保你的数据是数值型的,并且通常建议进行标准化处理。这是因为PCA对特征的尺度非常敏感,如果某个特征的数值范围远大于其他特征,它可能会在主成分中占据不合理的权重。标准化能让所有特征都处于同一量级,确保PCA能公平地考虑每个特征的贡献。

import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA import matplotlib.pyplot as plt # 1. 模拟一些高维数据 # 假设我们有100个样本,每个样本有10个特征 np.random.seed(42) X = np.random.rand(100, 10) * 10 # 随机生成数据 # 制造一些相关性,让PCA有意义 X[:, 0] = X[:, 1] * 0.8 + np.random.rand(100) * 2 X[:, 2] = X[:, 3] * 1.2 + np.random.rand(100) * 3 # 2. 数据标准化 # 这一步我觉得是很多初学者容易忽略但又至关重要的一环。 # 如果数据尺度差异大,不标准化PCA的结果会很偏。 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 3. 实例化PCA模型 # 这里我们先不指定n_components,后面可以分析选择多少个主成分 pca = PCA() # 4. 拟合数据 # PCA模型会学习数据的主成分方向 pca.fit(X_scaled) # 5. 转换数据 # 将原始数据投影到新的主成分空间 X_pca = pca.transform(X_scaled) print("原始数据维度:", X.shape) print("转换后数据维度:", X_pca.shape) # 默认情况下,转换后维度与原始维度相同 # 查看每个主成分解释的方差比例 explained_variance_ratio = pca.explained_variance_ratio_ print("每个主成分解释的方差比例:", explained_variance_ratio) # 绘制解释方差比例图(Scree Plot) # 这个图对选择主成分数量很有帮助 plt.figure(figsize=(10, 6)) plt.plot(range(1, len(explained_variance_ratio) + 1), explained_variance_ratio, marker='o', linestyle='--') plt.title('Scree Plot (Explained Variance Ratio per Principal Component)') plt.xlabel('Principal Component Number') plt.ylabel('Explained Variance Ratio') plt.grid(True) plt.show() # 如果我们想降维到2维 pca_2d = PCA(n_components=2) X_pca_2d = pca_2d.fit_transform(X_scaled) print("降维到2维后的数据维度:", X_pca_2d.shape) # 绘制降维后的数据(如果降到2维或3维方便可视化) plt.figure(figsize=(8, 6)) plt.scatter(X_pca_2d[:, 0], X_pca_2d[:, 1], alpha=0.7) plt.title('PCA Transformed Data (2 Components)') plt.xlabel('Principal Component 1') plt.ylabel('Principal Component 2') plt.grid(True) plt.show()
上面的代码片段展示了从数据生成到PCA降维和简单可视化的完整流程。
主成分分析的原理是什么,以及它在数据降维中的作用?
主成分分析(PCA)的核心思想,说白了,就是找到数据里那些最重要的“方向”。想象一下,你有一堆散落在三维空间里的点,这些点可能大部分都沿着某个平面分布,或者沿着某条直线分布。PCA的目的就是找到这个平面或直线,然后把所有点都投影到上面去。这样一来,虽然维度降低了,但数据最重要的信息(也就是方差最大的那些变化)却被保留了下来。

具体点讲,PCA通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,这些新变量被称为主成分。每个主成分都是原始变量的线性组合。第一个主成分捕获了数据中最大的方差,第二个主成分捕获了剩余方差中最大的部分,并且它与第一个主成分是正交的,以此类推。
在数学上,这其实就是求解数据协方差矩阵的特征值和特征向量。特征向量定义了主成分的方向,而对应的特征值则表示了该方向上数据变化的强度(即方差)。选择那些特征值大的特征向量作为主成分,就意味着我们选择了那些能最大程度解释数据变异性的方向。
它在数据降维中的作用非常直接:
- 去除冗余信息:如果你的数据集里有很多特征是高度相关的,比如身高和体重,PCA可以把它们合并成更少、不相关的几个主成分,从而消除冗余。
- 提高模型效率:在高维数据上训练模型,计算量大,训练时间长,还容易出现“维度灾难”。降维后,模型训练会更快,性能可能更好。
- 数据可视化:当数据维度超过3维时,我们很难直观地看到数据分布。通过PCA降到2维或3维,就能用散点图等方式进行可视化,发现潜在的模式或聚类。
- 噪声过滤:一些低方差的主成分可能代表着数据中的噪声,通过丢弃这些主成分,可以在一定程度上实现数据去噪。
我个人觉得,PCA最妙的地方在于它提供了一种“看清”高维数据的能力,尤其是在探索性数据分析阶段,降维后的可视化往往能带来意想不到的洞察。
如何选择合适的主成分数量?
选择合适的主成分数量,这是一个实践中经常遇到的问题,而且说实话,没有一个放之四海而皆准的“黄金法则”。它往往需要在信息保留和维度降低之间做个权衡。不过,有一些常用的方法可以帮助我们做出决策:
累计解释方差比例(Cumulative Explained Variance Ratio): 这是最常用也最直观的方法。我们通常会计算每个主成分解释的方差比例,然后将它们累加起来。目标是选择足够多的主成分,使得它们累计解释的方差达到一个预设的阈值,比如90%或95%。 在Python中,
pca.explained_variance_ratio_
会给你每个主成分的解释方差比例,你可以用np.cumsum()
来计算累计值。# 接着上面的代码 cumulative_explained_variance = np.cumsum(pca.explained_variance_ratio_) print("累计解释方差比例:", cumulative_explained_variance) plt.figure(figsize=(10, 6)) plt.plot(range(1, len(cumulative_explained_variance) + 1), cumulative_explained_variance, marker='o', linestyle='-') plt.title('Cumulative Explained Variance') plt.xlabel('Number of Principal Components') plt.ylabel('Cumulative Explained Variance Ratio') plt.grid(True) plt.axhline(y=0.95, color='r', linestyle='--', label='95% Threshold') plt.legend() plt.show() # 找到达到95%方差所需的最小主成分数量 n_components_95 = np.where(cumulative_explained_variance >= 0.95)[0][0] + 1 print(f"达到95%累计解释方差至少需要 {n_components_95} 个主成分。")
通过这个图,你可以看到曲线在哪里变得平缓,那通常就是可以考虑截断的地方。
碎石图(Scree Plot): 这个图就是上面代码里已经画过的“Explained Variance Ratio per Principal Component”图。它展示了每个主成分解释的方差比例。我们寻找图中的“肘部”(elbow),也就是曲线从陡峭突然变得平缓的点。这个点之前的主成分通常被认为是重要的,而之后的贡献就比较小了。这有点像看地形,哪里有个明显的坡度变化,哪里就是个关键点。
根据下游任务的需求: 有时候,选择主成分的数量并不是纯粹基于方差解释,而是为了适应后续的机器学习任务。比如,如果降维是为了加速模型训练,那么即使损失一点信息,只要模型性能可以接受,更低的维度也是可以的。或者,如果目标是可视化,那么通常就直接降到2维或3维。
交叉验证: 更严谨的做法是,将PCA作为机器学习流水线的一部分,然后通过交叉验证来评估不同主成分数量对最终模型性能的影响。选择使模型在验证集上表现最好的主成分数量。这个方法虽然计算成本高一点,但结果通常更可靠。
我个人在实践中,一般会先看累计解释方差图和碎石图,定一个初步的范围,然后结合实际业务需求和后续模型表现来微调。这有点像在做菜,你得尝尝味道,不能光看菜谱。
PCA有哪些局限性,以及何时不宜使用?
虽然PCA在数据降维方面表现出色,但它也不是万能的。它有一些固有的局限性,了解这些能帮助我们避免在不合适的场景下滥用它。
线性假设: PCA是基于线性变换的。它假设数据中的主要结构可以通过线性组合来捕获。如果你的数据是非线性的,比如在一个甜甜圈形状的流形上,PCA可能就无能为力了。它可能会把甜甜圈“压扁”,导致数据点在低维空间中混杂在一起,丢失了原有的非线性结构。这种情况下,你可能需要考虑非线性降维方法,比如流形学习算法(如Isomap、LLE、t-SNE或UMAP)。
对异常值敏感: PCA通过方差最大化的方式来寻找主成分。异常值(outliers)由于其远离数据中心的特性,往往会贡献很大的方差。这意味着,即使只有一个或几个异常值,它们也可能严重影响主成分的方向,导致降维结果偏离真实的数据结构。在运行PCA之前,进行异常值检测和处理通常是个好习惯。
主成分的解释性: 虽然PCA降低了维度,但新生成的主成分是原始特征的线性组合,它们往往失去了原始特征的直观含义。比如,一个主成分可能是“0.3 身高 + 0.5 体重 - 0.2 * 年龄”。这样的组合很难像“身高”或“体重”那样直接解释。这对于需要强可解释性的应用场景来说,是一个不小的挑战。
无法区分重要性: PCA只关注方差最大的方向,它并不知道哪些方差是“有意义”的,哪些是“噪声”或者与你后续任务无关的。举个例子,如果你的数据中有一个特征虽然方差很小,但它对你的预测目标至关重要,PCA可能会因为它方差小而降低它的权重,甚至在降维时将其信息丢弃。
数据标准化是前提: 前面提过,PCA对特征的尺度非常敏感。如果特征没有标准化,那些数值范围大的特征可能会主导主成分的方向,即使它们在实际业务中并不那么重要。所以,忘记标准化几乎肯定会导致结果不尽人意。
何时不宜使用PCA?
- 数据结构明显是非线性的:如果你已经通过可视化或者领域知识判断数据存在复杂的非线性关系,PCA可能不是最佳选择。
- 需要保持特征的原始可解释性:如果你的目标不仅仅是降维,还需要对降维后的特征进行业务解释,那么PCA可能不适合。
- 数据中存在大量或影响显著的异常值:在未处理异常值的情况下直接应用PCA,结果可能被误导。
- 所有特征的方差都大致相同且都很重要:如果数据中没有明显的方差差异,或者每个特征都同等重要,PCA可能无法有效降维,或者降维后信息损失过大。
- 特征数量本身就不多:如果你的数据集只有几个特征,进行PCA降维的收益可能很小,甚至可能因为信息损失而弊大于利。
总的来说,PCA是一个强大的工具,但它有自己的适用范围。在实际应用中,多尝试、多分析,结合具体业务场景来判断是否使用,以及如何使用,才是最稳妥的办法。
今天关于《Python主成分分析实现方法详解》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

- 上一篇
- PHP生成OG标签,提升新闻页分享效果

- 下一篇
- CSS文字闪烁与逐字高亮实现方法
-
- 文章 · python教程 | 2分钟前 |
- Python模板引擎使用技巧全解析
- 402浏览 收藏
-
- 文章 · python教程 | 11分钟前 | 异常检测 隐私保护 联邦学习 PySyft TensorFlowFederated
- 联邦学习如何保护隐私进行异常检测?
- 453浏览 收藏
-
- 文章 · python教程 | 11分钟前 |
- 隐藏Streamlit数据框下载按钮的技巧
- 138浏览 收藏
-
- 文章 · python教程 | 30分钟前 |
- Python连接Kafka配置详解
- 326浏览 收藏
-
- 文章 · python教程 | 38分钟前 |
- PythonDataFrame合并技巧:concat与merge对比详解
- 172浏览 收藏
-
- 文章 · python教程 | 40分钟前 |
- def关键字详解,Python函数定义教程
- 121浏览 收藏
-
- 文章 · python教程 | 50分钟前 |
- Lua递归解析技巧与应用详解
- 274浏览 收藏
-
- 文章 · python教程 | 58分钟前 | Python 强化学习 Q-learning 策略梯度 经验回放
- Python实现Q-learning强化学习教程
- 439浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- AI歌曲生成器
- AI歌曲生成器,免费在线创作,简单模式快速生成,自定义模式精细控制,多种音乐风格可选,免版税商用,让您轻松创作专属音乐。
- 3次使用
-
- MeloHunt
- MeloHunt是一款强大的免费在线AI音乐生成平台,让您轻松创作原创、高质量的音乐作品。无需专业知识,满足内容创作、影视制作、游戏开发等多种需求。
- 3次使用
-
- 满分语法
- 满分语法是一款免费在线英语语法检查器,助您一键纠正所有英语语法、拼写、标点错误及病句。支持论文、作文、翻译、邮件语法检查与文本润色,并提供详细语法讲解,是英语学习与使用者必备工具。
- 12次使用
-
- 易销AI-专为跨境
- 易销AI是专为跨境电商打造的AI营销神器,提供多语言广告/产品文案高效生成、精准敏感词规避,并配备定制AI角色,助力卖家提升全球市场广告投放效果与回报率。
- 16次使用
-
- WisFile-批量改名
- WisFile是一款免费AI本地工具,专为解决文件命名混乱、归类无序难题。智能识别关键词,AI批量重命名,100%隐私保护,让您的文件井井有条,触手可及。
- 13次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览