根据集群中心更改R中kmeans生成的集群数

时间:2016-11-11 03:13:13

标签: r k-means

我在R中使用简单的kmeans来聚类单个向量。由于簇编号是相当任意分配的(我推测),我需要按顺序(使用集群中心)获取它们。

这是一个例子:

> vals <- c(0.22, 0.17, 0.21, 0.13, 0.00)
> set.seed(32833)
> cl <- kmeans(vals ,3)

> cl$cluster
[1] 2 3 2 3 1

> cl$centers
   [,1]
1 0.000
2 0.215
3 0.150

从群集中心可以看出,Cluter中心按(升序)顺序的群集顺序为:1,3,2。

我想返回相应变换的已识别簇的矢量:

e.g。变换(cl $ cluster)应该给我3 2 3 2 1.

我已经尝试通过排序来处理因子级别,但是无法使其达到逻辑结束。

> cl$cluster <- as.factor(as.character(cl$cluster))
> levels(cl$cluster) <- order(-cl$centers)
> cl$cluster
[1] 3 1 3 1 2
Levels: 2 3 1

2 个答案:

答案 0 :(得分:1)

我认为,好的答案是在最后一行中使用rank()而不是order()。 在这个特定示例中,结果是相同的,但在其他情况下,带有函数order()的结果是错误的。

另一个例子是4个集群,其中较好的解决方案是使用rank()以递增的顺序对集群的值进行重新排序:

vals <- c(0.22, 0.17, 0.21, 0.13, 0.00, 0.40, 0.50)
set.seed(32833)
cl <- kmeans(vals ,4)

cl$cluster
[1] 4 2 4 2 3 1 1

cl$centers
[,1]
1 0.450
2 0.150
3 0.000
4 0.215

order(cl$centers)[cl$cluster]
[1] 1 2 1 2 4 3 3

rank(cl$centers)[cl$cluster]
[1] 3 2 3 2 1 4 4

这里的好结果是每次都工作的rank()。

答案 1 :(得分:0)

您可以按中心向量的顺序索引聚类向量。在您的示例中,

vals <- c(0.22, 0.17, 0.21, 0.13, 0.00)
set.seed(32833)
cl <- kmeans(vals ,3)

cl$cluster
[1] 2 3 2 3 1

cl$centers
   [,1]
1 0.000
2 0.215
3 0.150

order(cl$centers)[cl$cluster]
[1] 3 2 3 2 1

其他人可以使用as.factor解决方案,因为这也是一个选项。