3

我正在处理一个相对较大的数据集(仅使用其中的 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 的概念。

4

1 回答 1

2

pc$loadings找到输入变量的坐标,而不是个体的坐标。所以kmeans(new_df,2)分类变量而不是个人。为确保这一点,请尝试使用 10x5 data.frame 而不是 10x10 one 的代码:您只会获得 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)

但是,如果您打算对个体进行聚类,即原始数据框的行,则需要对主成分分析产生的行坐标执行聚类。我不知道如何访问那些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
于 2015-08-15T07:40:28.323 回答