1

假设我有一个数据集 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 似乎随机标记了簇号。我查看了文档,但找不到任何东西。如果您能提供帮助,请告诉我!

4

2 回答 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

希望这可以帮助。

于 2019-05-27T12:08:24.517 回答
0

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

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

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

于 2013-07-17T08:19:51.957 回答