【问题标题】:Contributions of variables to PC in python [closed]python中变量对PC的贡献[关闭]
【发布时间】:2019-04-09 03:50:54
【问题描述】:

我使用 PCA 找到了 60 台 PC:

N_comp=60 
from sklearn.decomposition import PCA
pca = PCA(n_components = N_comp)
X_pca=pca.fit_transform(X_scale) #lower dimension data
eigenvalues=pca.components_

现在,我正在尝试找出我的特征(X 数据的列)对 PC1 和 PC2 的贡献。例如,对于 PC1,我想显示前 10 个特征中每个特征的百分比的条形图,其中 x 轴将具有特征的标签。

类似这样的:

我正在尝试在 python 中执行此操作,但不知道如何找到功能名称。例如,我所做的是排序以查找构成 PC1 的前 10 个特征变量:

N_elements=10
PC1=abs(eigenvalues[1,:])
PC1.sort(axis=0)
PC1=PC1[::-1]
PC1=PC1[0:N_elements]
PC1

结果

array([0.17040832, 0.16937861, 0.1683676 , 0.16544657, 0.16491703,
   0.16491679, 0.16168056, 0.16108829, 0.16034576, 0.16029183])

并绘制它:

plt.bar(range(N_elements), PC1, alpha=0.3, align='center')
plt.title('Contributions of variables to PC1')

但这会导致 X 轴只有数字 0 到 9(对应于 10 个元素)。如何检索名称并在绘图栏上放置标签?

非常感谢!

【问题讨论】:

  • 您提供的链接提供了一个明确的公式,如何计算变量对主成分的百分比贡献。你为什么不实现这个?
  • 您似乎特别想要 fviz_contrib 函数。您链接到的页面似乎为如何应用它提供了一个很好的指南,如果您遇到特定问题,您应该详细说明您实际尝试过的内容以及遇到的问题。
  • 这是一个与您最初提出的问题完全不同的问题(它有一个r 编码标签,因此下面给出了答案)。在 3 小时不活动后并在收到 SO 用户对您原始问题的回答后完全更改问题是非常糟糕的形式。它显示了对一般 SO 发布指南的无视和对 SO 社区的不尊重。我投票反对重新开放这个问题。相反,应该删除该问题,并且 OP 应该考虑提出一个新问题。

标签: python plot bar-chart pca feature-extraction


【解决方案1】:

首先,请考虑 cmets 以及您可以采取哪些措施来提高问题的质量。这里的“好”问题的关键组成部分是 (1) 可重现的样本数据,(2) 真正的代码尝试,以及 (3) 特定 编码问题,而不是询问“如何实现”的帖子XYZ”。

除此之外,以下内容应该可以帮助您入门。所有信息实际上都在您自己提供的链接中,我建议您花一些时间了解材料。

  1. 首先,由于您不提供示例数据,让我们使用内置的USArrest 数据集。我们使用prcomp 执行 PCA

    pca <- prcomp(USArrests)
    
  2. 我们通过将变量载荷和标准差相乘得到坐标

    coord <- t(t(pca$rotation) * pca$sdev)
    

    这里的t(t(...) * ...) 构造确保我们将变量载荷矩阵pca$rotation 的每一列的条目与向量pca$sdev 中的相应条目相乘。

  3. 如链接中所述,变量贡献只是平方坐标,表示为每个主成分的平方坐标之和的百分比

    contrib <- t(t(coord ^ 2) / colSums(coord ^ 2)) * 100
    contrib
    #                PC1        PC2        PC3        PC4
    #Murder    0.1739250  0.2008981  0.6382517 98.9869251
    #Assault  99.0465399  0.3452741  0.4565669  0.1516191
    #UrbanPop  0.2147001 95.4250536  4.0218813  0.3383649
    #Rape      0.5648349  4.0287742 94.8833000  0.5230908
    
  4. 让我们将其与factoextra::get_pca_var的结果进行比较

    get_pca_var(pca)$contrib
    #              Dim.1      Dim.2      Dim.3      Dim.4
    #Murder    0.1739250  0.2008981  0.6382517 98.9869251
    #Assault  99.0465399  0.3452741  0.4565669  0.1516191
    #UrbanPop  0.2147001 95.4250536  4.0218813  0.3383649
    #Rape      0.5648349  4.0287742 94.8833000  0.5230908
    

    如您所见,结果是相同的。 我把阴谋留给你;您可以在 SO 和网络上找到有关如何在此处显示条形图的大量建议。

【讨论】:

  • @AAA 你自己用r代码标签标记了这个;现在,在您闲置 3 小时(!!)后,您告诉我们您正在寻找 Python 解决方案?这是非常糟糕的形式,对迄今为止一直试图帮助你的每个人都非常粗鲁。请记住,您是在向互联网上的陌生人寻求免费帮助。这种行为是不可接受的。
  • 我对此表示赞赏并同意。我也花了一些时间才意识到我不明白的......
【解决方案2】:

主成分的元素与变量的顺序相同。具有相应索引 (i = 1 ... p) 的元素的绝对值越大,该变量对该 PC 的转换的贡献就越大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2012-06-27
    • 1970-01-01
    相关资源
    最近更新 更多