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

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

要用Python实现PCA,最直接的方法是使用sklearn.decomposition模块里的PCA类。整个过程大致分为数据准备、实例化PCA模型、拟合数据和转换数据这几步。
首先,确保你的数据是数值型的,并且通常建议进行标准化处理。这是因为PCA对特征的尺度非常敏感,如果某个特征的数值范围远大于其他特征,它可能会在主成分中占据不合理的权重。标准化能让所有特征都处于同一量级,确保PCA能公平地考虑每个特征的贡献。
立即学习“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的目的就是找到这个平面或直线,然后把所有点都投影到上面去。这样一来,虽然维度降低了,但数据最重要的信息(也就是方差最大的那些变化)却被保留了下来。

具体点讲,PCA通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,这些新变量被称为主成分。每个主成分都是原始变量的线性组合。第一个主成分捕获了数据中最大的方差,第二个主成分捕获了剩余方差中最大的部分,并且它与第一个主成分是正交的,以此类推。
在数学上,这其实就是求解数据协方差矩阵的特征值和特征向量。特征向量定义了主成分的方向,而对应的特征值则表示了该方向上数据变化的强度(即方差)。选择那些特征值大的特征向量作为主成分,就意味着我们选择了那些能最大程度解释数据变异性的方向。
它在数据降维中的作用非常直接:
我个人觉得,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可能就无能为力了。它可能会把甜甜圈“压扁”,导致数据点在低维空间中混杂在一起,丢失了原有的非线性结构。这种情况下,你可能需要考虑非线性降维方法,比如流形学习算法(如Isomap、LLE、t-SNE或UMAP)。
对异常值敏感: PCA通过方差最大化的方式来寻找主成分。异常值(outliers)由于其远离数据中心的特性,往往会贡献很大的方差。这意味着,即使只有一个或几个异常值,它们也可能严重影响主成分的方向,导致降维结果偏离真实的数据结构。在运行PCA之前,进行异常值检测和处理通常是个好习惯。
主成分的解释性: 虽然PCA降低了维度,但新生成的主成分是原始特征的线性组合,它们往往失去了原始特征的直观含义。比如,一个主成分可能是“0.3 身高 + 0.5 体重 - 0.2 * 年龄”。这样的组合很难像“身高”或“体重”那样直接解释。这对于需要强可解释性的应用场景来说,是一个不小的挑战。
无法区分重要性: PCA只关注方差最大的方向,它并不知道哪些方差是“有意义”的,哪些是“噪声”或者与你后续任务无关的。举个例子,如果你的数据中有一个特征虽然方差很小,但它对你的预测目标至关重要,PCA可能会因为它方差小而降低它的权重,甚至在降维时将其信息丢弃。
数据标准化是前提: 前面提过,PCA对特征的尺度非常敏感。如果特征没有标准化,那些数值范围大的特征可能会主导主成分的方向,即使它们在实际业务中并不那么重要。所以,忘记标准化几乎肯定会导致结果不尽人意。
何时不宜使用PCA?
总的来说,PCA是一个强大的工具,但它有自己的适用范围。在实际应用中,多尝试、多分析,结合具体业务场景来判断是否使用,以及如何使用,才是最稳妥的办法。
以上就是怎样用Python实现数据的主成分分析?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号