从主成分的 K-Means 中提取有用信息

Extracting useful information from K-Means on Principal Components

我正在处理一个相对较大的数据集(只使用了它的大约 1/32,但是这个子集大约是 50000x9000)。为了对此进行分析,我采取了几个步骤来降低维度,以便我可以应用某种聚类算法。

看看下面的数据框:

set.seed(340)
df = data.frame(replicate(10,sample(0:10,size = 10,replace = TRUE)))
> df
   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1   4  9  4  6  9  4  2  5  8   8
2   5  8  2  0  4  6  1  1  0  10
3   1  7  6  3  5  9  6  0  7   1
4   0  6  8  6  6  0  5  5 10  10
5   2  0  5  8  2 10  8  2  1   5
6   3  9 10  2  8  5  2 10  3  10
7   9  0  1  0  6  8  9  6  5   0
8   5  6  9  3 10  4  4  8  6   9
9   8  7  6  2 10  9  9  7  1  10
10  0  7  2  6  1  6  3  2  3   9

每一行代表一个人,每个变量表示该人表现出该品质的频率。假设我使用 princomp() 对此执行主成分分析,并收集前四个 pc 用于 k 均值。

pc = princomp(df)
new_df = cbind(pc$loadings[,1],pc$loading[,2],pc$loadings[,3],pc$loadings[,4])
fit = kmeans(new_df,2)

据此我可以推断出哪个集群展示了哪些主成分的高值,我可以在其中使用负载来查看每个主成分的一般度量。但是,我想最终将此信息连接到我的原始数据集。有没有一种方法可以将原始数据中的每个人聚类到根据主成分分析的 k 均值创建的聚类?还是我误解了PCA的概念。

pc$loadings 找到输入 变量 的坐标,而不是个体的坐标。所以 kmeans(new_df,2) 对变量而不是个体进行分类。为确保这一点,请尝试使用 10x5 data.frame 而不是 10x10 的代码:您只能获得 5 个簇坐标:

df = data.frame(replicate(5,sample(0:10,size = 10,replace = TRUE)))
pc = princomp(df)
new_df = cbind(pc$loadings[,1],pc$loading[,2],pc$loadings[,3],pc$loadings[,4])
fit = kmeans(new_df,2)
fit$cluster
X1 X2 X3 X4 X5 
 2  2  1  2  2 

如果那是你想要做的,那么你可以 rbind fit$cluster 到你原来的 data.frame 并且你将拥有你的变量簇。

df <- rbind(df,fit$cluster)

但是,如果您打算对个体进行聚类,即原始 data.frame 的行,则需要对主成分分析生成的行坐标执行聚类。我不知道如何访问 princomp 中的那些,但其他 pca 方法可以轻松做到这一点。 FactoMineR::PCA 输出一个包含行坐标 ($ind$coord) 和列坐标 ($var$coord) 的列表。

library(FactoMineR)
pf <- PCA(df,graph=FALSE)

fit <- kmeans(pf$ind$coord[,1:4],2)

fit$cluster
 1  2  3  4  5  6  7  8  9 10 
 1  2  1  1  1  2  1  1  1  2 

将这些添加到您的原始 data.frame:

df$cluster <- fit$cluster