有没有办法更改 kmeans()$cluster 上的索引?

Is there a way to change the index on kmeans()$cluster?

我正在使用 kmeans() 根据分数创建组。目标是分配星级,得分最高的个人获得四颗星,得分最低的个人获得一颗星。我想根据 kmeans()$cluster 值创建 star 变量。然而,就目前而言,kmeans()$cluster 对集群进行了索引,但该索引并不对应于组的相对位置。

有没有办法手动分配簇索引,或者设置索引按一定顺序分配?我希望低分组有 kmeans()$cluster=1,第二低组有 kmeans()$cluster=2,等等

id <- 1:500
set.seed(12); score <- runif(500, 0, 1)

dat <- data.frame(id, score)

km = kmeans(dat$score, 4, nstart=10)

plot(dat$score,
     col = c(km$cluster), 
     main="K-Means result with 4 clusters", 
     pch=20, 
     cex=0.8)

dat$star <- km$cluster

plot(dat$score, 
     dat$star, 
     main="Score v. cluster number")

是的。您可以只使用一小部分 table 您想要的值,然后使用原始簇号来查找它们。这是一个例子。

set.seed(2017)
KM3 = kmeans(iris[,1:4], 3)
KM3$cluster

[1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[39] 2 2 2 2 2 2 2 2 2 2 2 2 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[77] 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 1 1 1 1 3 1 1 1 1 1 1 3
[115] 3 1 1 1 1 3 1 3 1 3 1 1 3 3 1 1 1 1 1 3 1 1 1 1 3 1 1 1 3 1 1 1 3 1 1 3

集群的顺序很乱。我希望低编号点在簇 1 中,中间点在簇 2 中,高编号点在簇 3 中。所以我想将所有 1 更改为 3,将 2 更改为 1,将 3 更改为 2。

Relabel = c(3,1,2)
KM3$cluster = Relabel[KM3$cluster]
KM3$cluster
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [39] 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [77] 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3 3 3 3 3 3 2
[115] 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3 3 3 2 3 3 2

只是一些额外的细节。它说 Relabel = c(3,1,2) 因为我想让 1 变成 3,所以第一个位置有 3。我想让 2 变成 1,所以第二个位置有 1。我想让 3 变成 2,所以第三个位置有2.

其中任何一个都会产生一个新的聚类分配向量,其中 1 表示具有最小中心的聚类,2 表示下一个,依此类推。第一个仅用 fitted(km) 表示,第二个用 km$centerskm$cluster 表示,最后一个用 fitted(km) 和 [=15= 表示]

fit <- fitted(km)
factor(fit, labels = 1:nlevels(factor(fit)))

rank(km$centers)[km$cluster])

match(fitted(km), sort(km$centers))