You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中PCA分析的Y轴方差刻度绘制异常问题

问题:PCA分析中方差解释率图Y轴不符合预期(百分比总和未达100%)

我正在进行PCA分析,但无法正确绘制Y轴的方差图。已提供含6个特征的鱼类数据集,现有实现代码如下:

import pandas as pd
import sklearn
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt

fishes = pd.read_csv("fish.csv", header=None, index_col=False, skiprows=1, usecols=range(1,7))
fishes.head()

scaler = StandardScaler()
pca = PCA()
pipeline = make_pipeline(scaler, pca)
pipeline.fit(fishes)

features = range(pca.n_components_)
plt.bar(features, pca.explained_variance_)
plt.xlabel('PCA feature')
plt.ylabel('variance')
plt.xticks(features)
plt.show()

当前输出不符合预期:我理解PCA的Y轴方差应为100%,但前三个主成分的解释占比过低,即使按1代表10%计算,总和也达不到100%。疑惑是代码存在错误,还是需要手动调整Y轴刻度?请指出问题所在。


回答

核心问题在于你用错了PCA的属性!你现在调用的pca.explained_variance_返回的是每个主成分能解释的原始方差值——因为你用了StandardScaler标准化数据,每个特征的方差被缩为1,总方差等于特征数量(也就是6),所以这些数值加起来是6,自然不是你期望的100%。

而你想要的方差解释率百分比,对应的正确属性是pca.explained_variance_ratio_:这个属性返回每个主成分方差占总方差的比例,所有值加起来总和为1,转换成百分比后就是你期望的100%。

修改代码非常简单,只需要把绘图行替换成下面的内容(如果要显示百分比,记得乘以100):

plt.bar(features, pca.explained_variance_ratio_ * 100)
plt.xlabel('PCA feature')
plt.ylabel('Explained Variance (%)')  # 同步修改Y轴标签更准确
plt.xticks(features)
plt.show()

额外补充:如果想直观看到前N个主成分的累积解释率,可以用cumsum()绘制折线图,代码示例如下:

plt.plot(features, pca.explained_variance_ratio_.cumsum() * 100, marker='o')
plt.xlabel('Number of PCA Features')
plt.ylabel('Cumulative Explained Variance (%)')
plt.xticks(features)
plt.grid(True)
plt.show()

这样你就能清晰看到前几个主成分就能覆盖大部分数据方差了。

内容的提问来源于stack exchange,提问作者Anakin Skywalker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:12:47