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
相关产品推荐
相关产品推荐

