python中变量对PC的贡献

时间:2019-04-09 03:50:54

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

我用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轴带有功能标签。

类似这样的东西: https://i.stack.imgur.com/Hz24K.png

我正在尝试在python中执行此操作,但无法弄清楚如何找到功能名称。例如,我所做的就是排序以查找构成PC1的前十个功能变量:

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个元素)。我如何检索名称并将标签放在绘图栏上?

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

首先,请考虑注释以及您可以采取哪些措施来改善问题的质量。这里的“好”问题的关键组成部分是(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和网络上找到有关如何显示Barplot的大量建议。