0

0

怎样用Python实现数据的主成分分析?

星夢妙者

星夢妙者

发布时间:2025-08-01 10:31:01

|

623人浏览过

|

来源于php中文网

原创

pca的原理是通过正交变换将相关变量转换为线性无关的主成分,以保留数据最大方差方向实现降维。1. 主成分是原始特征的线性组合,按方差从大到小排列;2. 降维时选择前k个主成分以保留足够信息;3. 数据需标准化处理以避免特征尺度影响;4. 主要作用包括去除冗余、提升模型效率、可视化及去噪。局限包括:1. 假设数据线性相关,不适用于非线性结构;2. 对异常值敏感;3. 主成分缺乏可解释性;4. 忽略低方差但可能重要的特征;5. 降维效果依赖标准化预处理。适用场景为数据线性相关、无需特征可解释性、无显著异常值且特征多的情况下使用。

怎样用Python实现数据的主成分分析?

用Python实现数据的主成分分析(PCA)通常依赖于科学计算库,其中scikit-learn是最常用也最方便的选择。它提供了一个直观的接口来执行这项任务,核心思想就是找到数据中方差最大的几个方向,将高维数据投影到这些低维空间上,从而达到降维的目的。

怎样用Python实现数据的主成分分析?

解决方案

要用Python实现PCA,最直接的方法是使用sklearn.decomposition模块里的PCA类。整个过程大致分为数据准备、实例化PCA模型、拟合数据和转换数据这几步。

首先,确保你的数据是数值型的,并且通常建议进行标准化处理。这是因为PCA对特征的尺度非常敏感,如果某个特征的数值范围远大于其他特征,它可能会在主成分中占据不合理的权重。标准化能让所有特征都处于同一量级,确保PCA能公平地考虑每个特征的贡献。

立即学习Python免费学习笔记(深入)”;

怎样用Python实现数据的主成分分析?
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的目的就是找到这个平面或直线,然后把所有点都投影到上面去。这样一来,虽然维度降低了,但数据最重要的信息(也就是方差最大的那些变化)却被保留了下来。

怎样用Python实现数据的主成分分析?

具体点讲,PCA通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,这些新变量被称为主成分。每个主成分都是原始变量的线性组合。第一个主成分捕获了数据中最大的方差,第二个主成分捕获了剩余方差中最大的部分,并且它与第一个主成分是正交的,以此类推。

在数学上,这其实就是求解数据协方差矩阵的特征值和特征向量。特征向量定义了主成分的方向,而对应的特征值则表示了该方向上数据变化的强度(即方差)。选择那些特征值大的特征向量作为主成分,就意味着我们选择了那些能最大程度解释数据变异性的方向。

华友协同办公自动化OA系统
华友协同办公自动化OA系统

华友协同办公管理系统(华友OA),基于微软最新的.net 2.0平台和SQL Server数据库,集成强大的Ajax技术,采用多层分布式架构,实现统一办公平台,功能强大、价格便宜,是适用于企事业单位的通用型网络协同办公系统。 系统秉承协同办公的思想,集成即时通讯、日记管理、通知管理、邮件管理、新闻、考勤管理、短信管理、个人文件柜、日程安排、工作计划、工作日清、通讯录、公文流转、论坛、在线调查、

下载

它在数据降维中的作用非常直接:

  1. 去除冗余信息:如果你的数据集里有很多特征是高度相关的,比如身高和体重,PCA可以把它们合并成更少、不相关的几个主成分,从而消除冗余。
  2. 提高模型效率:在高维数据上训练模型,计算量大,训练时间长,还容易出现“维度灾难”。降维后,模型训练会更快,性能可能更好。
  3. 数据可视化:当数据维度超过3维时,我们很难直观地看到数据分布。通过PCA降到2维或3维,就能用散点图等方式进行可视化,发现潜在的模式或聚类。
  4. 噪声过滤:一些低方差的主成分可能代表着数据中的噪声,通过丢弃这些主成分,可以在一定程度上实现数据去噪。

我个人觉得,PCA最妙的地方在于它提供了一种“看清”高维数据的能力,尤其是在探索性数据分析阶段,降维后的可视化往往能带来意想不到的洞察。

如何选择合适的主成分数量?

选择合适的主成分数量,这是一个实践中经常遇到的问题,而且说实话,没有一个放之四海而皆准的“黄金法则”。它往往需要在信息保留和维度降低之间做个权衡。不过,有一些常用的方法可以帮助我们做出决策:

  1. 累计解释方差比例(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} 个主成分。")

    通过这个图,你可以看到曲线在哪里变得平缓,那通常就是可以考虑截断的地方。

  2. 碎石图(Scree Plot): 这个图就是上面代码里已经画过的“Explained Variance Ratio per Principal Component”图。它展示了每个主成分解释的方差比例。我们寻找图中的“肘部”(elbow),也就是曲线从陡峭突然变得平缓的点。这个点之前的主成分通常被认为是重要的,而之后的贡献就比较小了。这有点像看地形,哪里有个明显的坡度变化,哪里就是个关键点。

  3. 根据下游任务的需求: 有时候,选择主成分的数量并不是纯粹基于方差解释,而是为了适应后续的机器学习任务。比如,如果降维是为了加速模型训练,那么即使损失一点信息,只要模型性能可以接受,更低的维度也是可以的。或者,如果目标是可视化,那么通常就直接降到2维或3维。

  4. 交叉验证: 更严谨的做法是,将PCA作为机器学习流水线的一部分,然后通过交叉验证来评估不同主成分数量对最终模型性能的影响。选择使模型在验证集上表现最好的主成分数量。这个方法虽然计算成本高一点,但结果通常更可靠。

我个人在实践中,一般会先看累计解释方差图和碎石图,定一个初步的范围,然后结合实际业务需求和后续模型表现来微调。这有点像在做菜,你得尝尝味道,不能光看菜谱。

PCA有哪些局限性,以及何时不宜使用?

虽然PCA在数据降维方面表现出色,但它也不是万能的。它有一些固有的局限性,了解这些能帮助我们避免在不合适的场景下滥用它。

  1. 线性假设: PCA是基于线性变换的。它假设数据中的主要结构可以通过线性组合来捕获。如果你的数据是非线性的,比如在一个甜甜圈形状的流形上,PCA可能就无能为力了。它可能会把甜甜圈“压扁”,导致数据点在低维空间中混杂在一起,丢失了原有的非线性结构。这种情况下,你可能需要考虑非线性降维方法,比如流形学习算法(如Isomap、LLE、t-SNE或UMAP)。

  2. 对异常值敏感: PCA通过方差最大化的方式来寻找主成分。异常值(outliers)由于其远离数据中心的特性,往往会贡献很大的方差。这意味着,即使只有一个或几个异常值,它们也可能严重影响主成分的方向,导致降维结果偏离真实的数据结构。在运行PCA之前,进行异常值检测和处理通常是个好习惯。

  3. 主成分的解释性: 虽然PCA降低了维度,但新生成的主成分是原始特征的线性组合,它们往往失去了原始特征的直观含义。比如,一个主成分可能是“0.3 身高 + 0.5 体重 - 0.2 * 年龄”。这样的组合很难像“身高”或“体重”那样直接解释。这对于需要强可解释性的应用场景来说,是一个不小的挑战。

  4. 无法区分重要性: PCA只关注方差最大的方向,它并不知道哪些方差是“有意义”的,哪些是“噪声”或者与你后续任务无关的。举个例子,如果你的数据中有一个特征虽然方差很小,但它对你的预测目标至关重要,PCA可能会因为它方差小而降低它的权重,甚至在降维时将其信息丢弃。

  5. 数据标准化是前提: 前面提过,PCA对特征的尺度非常敏感。如果特征没有标准化,那些数值范围大的特征可能会主导主成分的方向,即使它们在实际业务中并不那么重要。所以,忘记标准化几乎肯定会导致结果不尽人意。

何时不宜使用PCA?

  • 数据结构明显是非线性的:如果你已经通过可视化或者领域知识判断数据存在复杂的非线性关系,PCA可能不是最佳选择。
  • 需要保持特征的原始可解释性:如果你的目标不仅仅是降维,还需要对降维后的特征进行业务解释,那么PCA可能不适合。
  • 数据中存在大量或影响显著的异常值:在未处理异常值的情况下直接应用PCA,结果可能被误导。
  • 所有特征的方差都大致相同且都很重要:如果数据中没有明显的方差差异,或者每个特征都同等重要,PCA可能无法有效降维,或者降维后信息损失过大。
  • 特征数量本身就不多:如果你的数据集只有几个特征,进行PCA降维的收益可能很小,甚至可能因为信息损失而弊大于利。

总的来说,PCA是一个强大的工具,但它有自己的适用范围。在实际应用中,多尝试、多分析,结合具体业务场景来判断是否使用,以及如何使用,才是最稳妥的办法。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

549

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

30

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

44

2026.01.06

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1925

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2394

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号