python中变量对PC的贡献[关闭]

问题描述 投票:-3回答:2

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

非常感谢!

python plot bar-chart pca feature-extraction
2个回答
1
投票

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


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和网上找到关于如何在这里展示条形图的大量建议。
© www.soinside.com 2019 - 2024. All rights reserved.