我使用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
pca <- prcomp(USArrests)
coord <- t(t(pca$rotation) * pca$sdev)
这里的t(t(...) * ...)
构造确保我们将变量加载矩阵pca$rotation
的每一列的条目与向量pca$sdev
中的相应条目相乘。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
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和网上找到关于如何在这里展示条形图的大量建议。