我正在使用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有其他方式可以自动完成吗?
答案 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