考虑到中心的顺序,在 kmean 结果中重新标记样本

标签 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 自动完成吗?

最佳答案

一个想法是通过将您的中心与排序的中心匹配来创建一个命名向量。然后将向量与 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

关于考虑到中心的顺序,在 kmean 结果中重新标记样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48182601/

相关文章:

python - 导入错误: cannot import name TruncatedSVD

r - 有效地计算数据框列的百分位数

r - 老鼠 : glm. 适合:算法没有收敛

r - 忽略 R 中某些值的行求和值

python - 使用 BaggingClassifier 时打印决策树和 feature_importance

r - kmeans 分类到预定的质心

k-means - 如何使用TensorFlow实现k-means?

r - 在 R 中安装 RWeka 包时出错

用于食谱程序化分类的算法

r - 如何计算随机森林的类别权重