我用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的前十个功能变量:
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个元素)。我如何检索名称并将标签放在绘图栏上?
非常感谢!
答案 0 :(得分:1)
主要成分的元素与变量的顺序相同。具有相应索引(i = 1 ... p)的元素的绝对值越大,变量对PC转换的贡献就越大。
答案 1 :(得分:0)
首先,请考虑注释以及您可以采取哪些措施来改善问题的质量。这里的“好”问题的关键组成部分是(1)可重现的样本数据,(2)真正的代码尝试,以及(3)特定于 的编码问题,而不是询问“如何实现”的帖子。 XYZ”。
此外,以下内容将帮助您入门。实际上,所有信息都在您自己提供的链接中,建议您花一些时间来理解这些材料。
首先,由于您不提供示例数据,因此让我们使用内置的USArrest
数据集。我们使用prcomp
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和网络上找到有关如何显示Barplot的大量建议。