考虑到中心的顺序,在kmean结果中的Relabel样本

时间:2018-01-10 07:50:29

标签: r classification k-means

我正在使用kmeans来聚类我的数据,因为生成的结果我有一个计划。

我想根据有序中心重新标记样本。请考虑以下示例:

a = c("a","b","c","d","e","F","i","j","k","l","m","n")
b = c(1,2,3,20,21,21,40,41,42,4,23,50)

mydata = data.frame(id=a,amount=b)
result = kmeans(mydata$amount,3,nstart=10)

结果如下:

clus$cluster 
2 2 2 3 3 3 1 1 1 2 3 1

clus$centers
1 43.25
2  2.50
3 21.25


mydata = data.frame(mydata,label =clus$cluster)
mydata
    id amount  label
1   a      1        2
2   b      2        2
3   c      3        2
4   d     20        3
5   e     21        3
6   F     21        3
7   i     40        1
8   j     41        1
9   k     42        1
10  l      4        2
11  m     23        3
12  n     50        1

我正在寻找的是对中心进行分类并相应地生成标签:

1  2.50
2  21.25
3  43.25

并将样品标记为:

1 1 1 2 2 2 3 3 3 1 2 3 

,结果应为:

    id amount  label
1   a      1        1
2   b      2        1
3   c      3        1
4   d     20        2
5   e     21        2
6   F     21        2
7   i     40        3
8   j     41        3
9   k     42        3
10  l      4        1
11  m     23        2
12  n     50        3

我认为可以这样做,订购中心,并为每个样本取中心样本的最小距离索引作为该群集的标签。

R有其他方式可以自动完成吗?

2 个答案:

答案 0 :(得分:3)

一个想法是通过将中心与已排序的中心匹配来创建命名向量。然后将向量与mydata$label匹配,并替换为向量的名称,即

i1 <- setNames(match(sort(result$centers), result$centers), rownames(result$centers))

as.numeric(names(i1)[match(mydata$label, i1)])
# [1] 1 1 1 2 2 2 3 3 3 1 2 3

答案 1 :(得分:1)

如果你不介意循环

,你可以使用for循环
cls <- result$cluster
for (i in 1 : length(result$cluster)) 
     result$cluster[cls == order(result$centers)[i]] <- i

result$cluster
#[1] 1 1 1 2 2 2 3 3 3 1 2 3