python中变量对PC的贡献

python中变量对PC的贡献,python,plot,bar-chart,pca,feature-extraction,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轴将

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


非常感谢

主成分的元素和变量的顺序相同。具有相应索引的元素的绝对值越大(i=1…p),变量越大,对PC.

的转换就越大,请考虑评论和你能做什么来提高问题的质量。“好”问题的关键部分是(1)可复制的样本数据,(2)真正的代码尝试,(3)特定的编码问题,而不是问“如何实现XYZ”的帖子

撇开这一点不谈,以下几点应该可以让你开始。事实上,所有的信息都在你自己提供的链接中,我建议你花些时间理解这些材料

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

    pca <- prcomp(USArrests)
    
  • 让我们将其与
    factoextra::get\u pca\u 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和web上显示条形图,您可以找到很多建议


  • 您给出的链接提供了一个明确的公式,说明如何计算变量对主成分的贡献百分比。为什么不实现它呢?看起来您特别想要
    fviz_contrib
    函数。你链接到的页面似乎为如何应用它提供了一个很好的指南,如果你在做这件事时遇到了特定的问题,你应该更多地解释你实际尝试了什么以及你遇到了什么问题。这与你最初问的问题完全不同(有一个
    r
    编码标签,因此答案如下)。在不活动3小时后,以及在收到SO用户对您的原始问题的答复后,完全更改此问题是非常糟糕的。这表明无视SO发布的一般指导原则和对SO社区的不尊重。我投票反对重新打开此问题。相反,应删除此问题而OP应该考虑提出一个新的问题。@ AAA你自己用“<代码> R< /代码>代码标签标记这个;现在3小时后!关于您的不活动,您是在告诉我们您正在寻找Python解决方案?这是非常糟糕的形式,对迄今为止一直试图帮助您的所有人都非常粗鲁。请记住,您是在互联网上向陌生人寻求免费帮助。这种行为是不可接受的。我对此表示感谢并同意。我花了时间来了解莉兹还有我不明白的。。。
    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
    
    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