【问题标题】:Change the number of cluster produced by kmeans in R according to cluster center根据簇中心改变R中kmeans产生的簇数
【发布时间】:2017-03-25 05:54:34
【问题描述】:

我在 R 中使用简单的 kmeans 来聚类单个向量。由于集群编号是相当随意分配的(我想),我需要按顺序排列它们(使用集群中心)。

这是一个例子:

> vals <- c(0.22, 0.17, 0.21, 0.13, 0.00)
> set.seed(32833)
> cl <- kmeans(vals ,3)

> cl$cluster
[1] 2 3 2 3 1

> cl$centers
   [,1]
1 0.000
2 0.215
3 0.150

从聚类中心可以看出,聚类中心的(升序)顺序为:1,3,2。

我想返回一个相应转换的已识别集群的向量:

例如transform(cl$cluster) 应该给我 3 2 3 2 1。

我尝试通过排序来改变因子水平,但无法使其达到逻辑结束。

> cl$cluster <- as.factor(as.character(cl$cluster))
> levels(cl$cluster) <- order(-cl$centers)
> cl$cluster
[1] 3 1 3 1 2
Levels: 2 3 1

【问题讨论】:

    标签: r k-means


    【解决方案1】:

    我认为最好的答案是在最后一行使用 rank() 而不是 order()。 在这个特定示例中,结果是相同的,但在其他情况下,函数 order() 的结果是错误的。

    这里是另一个包含 4 个集群的示例,其中好的解决方案是使用 rank() 以升序重新排序集群的值:

    vals <- c(0.22, 0.17, 0.21, 0.13, 0.00, 0.40, 0.50)
    set.seed(32833)
    cl <- kmeans(vals ,4)
    
    cl$cluster
    [1] 4 2 4 2 3 1 1
    
    cl$centers
    [,1]
    1 0.450
    2 0.150
    3 0.000
    4 0.215
    
    order(cl$centers)[cl$cluster]
    [1] 1 2 1 2 4 3 3
    
    rank(cl$centers)[cl$cluster]
    [1] 3 2 3 2 1 4 4
    

    这里的好结果是每次都使用 rank() 获得。

    【讨论】:

      【解决方案2】:

      您可以按中心向量的顺序索引集群向量。在你的例子中,

      vals <- c(0.22, 0.17, 0.21, 0.13, 0.00)
      set.seed(32833)
      cl <- kmeans(vals ,3)
      
      cl$cluster
      [1] 2 3 2 3 1
      
      cl$centers
         [,1]
      1 0.000
      2 0.215
      3 0.150
      
      order(cl$centers)[cl$cluster]
      [1] 3 2 3 2 1
      

      其他人可以提出as.factor 解决方案,因为这也是一种选择。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-13
        • 2014-05-09
        • 2015-06-05
        • 1970-01-01
        • 2014-02-20
        • 2021-03-03
        • 2020-01-20
        • 2014-01-01
        相关资源
        最近更新 更多