假设我有一个数据集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似乎随机标记了簇数。我查看了文档,但一直找不到任何东西。如果你能提供帮助,请告诉我!
答案 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维的,请使用利用此算法提高效率的算法。对于一维数据,有比多变量数据更好的算法。