代码之家  ›  专栏  ›  技术社区  ›  Sir1

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

  •  3
  • Sir1  · 技术社区  · 8 年前

    我正在使用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 回复  |  直到 8 年前
        1
  •  3
  •   Sotos    8 年前

    一个想法是通过将中心与已排序的中心进行匹配来创建命名向量。然后将向量与 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
    
        2
  •  1
  •   kangaroo_cliff    8 年前

    您可以使用 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