我在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
答案 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
解决方案,因为这也是一个选项。