获取有序的kmeans群集标签

时间:2013-07-16 19:26:30

标签: r cluster-analysis k-means

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

fit <- kmeans(x,2)

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

我运行了k-means函数:

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

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

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中的factor选项,并将cluster值替换为cluster_vals数据框中的我的factor / character值:

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))
  }

Voila;现在,我有了一个基于因子/特征向量的顺序逻辑,将它们按顺序逻辑应用于随机创建的聚类向量。

# 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

希望这会有所帮助。

答案 1 :(得分:0)

K-means是一种随机算法。当标签在运行中不一致或以“升序”顺序排序时,它实际上是正确的。 但是你可以按照自己的意愿重新制作标签,你知道......

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

与2维和更高维数据相比,可以有效地对1维数据进行分类。如果您的数据是1维的,请使用利用此算法提高效率的算法。对于一维数据,有比多变量数据更好的算法。