【问题标题】:Get ordered kmeans cluster labels获取有序的 kmeans 集群标签
【发布时间】:2013-07-15 03:39:36
【问题描述】:

假设我有一个数据集 x 并执行以下 kmeans 集群:

fit <- kmeans(x,2)

我的问题是关于 fit$cluster 的输出:我知道它会给我一个整数向量(从 1:k 开始),指示每个点分配到的集群。相反,有没有办法将簇标记为 1,2 等...按照其中心数值递减的顺序?

例如:如果 x=c(1.5,1.4,1.45,.2,.3,.3) ,那么 fit$cluster 应该导致 (1,1,1,2,2,2)不是 导致 (2,2,2,1,1,1)

同样,如果x=c(1.5,.2,1.45,1.4,.3,.3) 那么 fit$cluster 应该返回(1,2,1,1,2,2),而不是(2,1,2,2,1,1)

现在,fit$cluster 似乎随机标记了簇编号。我查看了文档,但找不到任何东西。如果您能提供帮助,请告诉我!

【问题讨论】:

    标签: r cluster-analysis k-means


    【解决方案1】:

    K-means 是一种随机算法。当标签在运行中不一致或以“升序”顺序排列时,它实际上是正确的。 但是您当然可以根据需要重新映射标签,您知道...

    您似乎在使用一维数据。那么k-means其实并不是你最好的选择。

    与二维及更高维数据相比,一维数据可以有效地进行排序。如果您的数据是一维的,请使用一种算法来提高效率。对于一维数据,有比多变量数据更好的算法。

    【讨论】:

    • 感谢您的意见。我有几个后续问题:1)如果我继续使用 K-means,如何重新映射标签? 2)您能否指出我所提到的对一维数据进行排序的聚类算法的方向?再次感谢!
    • 1) 我不使用 R,所以我不能帮你。 2)它的名字不是“集群”。例如,寻找“核密度估计”和“自然间断”。 “聚类”通常用于多变量数据。
    【解决方案2】:

    我遇到了类似的问题。我有一个年龄向量,我想根据逻辑序数集将其分成 5 个因子组。我做了以下事情:

    我运行了 k-means 函数:

    k5 <- kmeans(all_data$age, centers = 5, nstart = 25)
    

    我建立了一个 k-means 索引和中心的数据框;然后按中心值排列。

    kmeans_index <- as.numeric(rownames(k5$centers))
    k_means_centres <- as.numeric(k5$centers)
    k_means_df <- data_frame(index=kmeans_index, centres=k_means_centres)
    k_means_df <- k_means_df %>% 
        arrange(centres)
    

    现在中心在 df 中按升序排列,我创建了我的 5 元素因子列表并将其绑定到数据框:

    factors <- c("very_young", "young", "middle_age", "old", "very_old")
    k_means_df <- cbind(k_means_df, factors)
    

    看起来像这样:

    > k_means_df
      index  centres    factors
    1     2 23.33770 very_young
    2     5 39.15239      young
    3     1 55.31727 middle_age
    4     4 67.49422        old
    5     3 79.38353   very_old
    

    我将集群值保存在数据框中并创建了一个虚拟因子列:

    cluster_vals <- data_frame(cluster=k5$cluster, factor=NA)
    

    最后,我遍历了 k_means_df 中的因子选项,并将集群值替换为我在 cluster_vals 数据框中的因子/字符值:

    for (i in 1:nrow(k_means_df))
      {
        index_val <- k_means_df$index[i]
        factor_val <- as.character(k_means_df$factors[i])
    
        cluster_vals <- cluster_vals %>% 
          mutate(factor=replace(factor, cluster==index_val, factor_val))
      }
    

    瞧;我现在有一个因子/字符向量,它们根据它们的序数逻辑应用于随机创建的聚类向量。

    # A tibble: 3,163 x 2
       cluster factor    
         <int> <chr>     
     1       4 old       
     2       2 very_young
     3       2 very_young
     4       2 very_young
     5       3 very_old  
     6       3 very_old  
     7       4 old       
     8       4 old       
     9       2 very_young
    10       5 young     
    # ... with 3,153 more rows
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-07-20
      • 2020-05-15
      • 2019-04-04
      • 2020-09-08
      • 2017-07-28
      • 2016-11-09
      • 2015-04-05
      • 2018-04-18
      • 2021-05-02
      相关资源
      最近更新 更多