gpt4 book ai didi

r - R 中 Kmeans 的一致簇顺序

转载 作者:行者123 更新时间:2023-12-02 03:04:57 24 4
gpt4 key购买 nike

这可能是不可能的,但到目前为止,Google 已经让我失望了,所以我希望其他人可能有一些见解。抱歉,如果之前有人问过这个问题。

背景是,我有一个不同城市信息的数据库,比如按年份排列的名称、人口、污染、犯罪等。我正在查询它以按城市聚合数据并将结果输出到表中。效果很好。

下一步是我在数据集上运行 R 中的 kmeans() 函数来查找簇,在测试中我发现通过“肘法”,5 个簇几乎总是一个不错的选择。

我遇到的问题是这些簇具有不同的含义/解释,因此我想使用簇对该行的解释来标记原始数据集中的每一行,而不是簇号。所以我不想将第 2 行标识为“集群 5”,我想说“人口少、犯罪率高、收入低”。

如果 R 以相同的顺序输出集群,假设集群 5 始终等同于“人口少、犯罪率高、收入低”的城市集群,那就可以正常工作,但事实并非如此。例如,如果您运行如下代码:

> a =  kmeans(city_date,centers=5)
> b = kmeans(city_date,centers=5)
> c = kmeans(city_date,centers=5)

运行此代码:

a$centers
b$centers
c$centers

簇将全部包含相同的数据集,但簇号将不同。因此,如果我在 SQL 中有一个具有簇号和解释的映射表,它将无法工作,因为当我有一天运行它时,它可能会将“人口少、犯罪率高、收入低”簇设为 5,而下一个簇可能是“人口少、犯罪率高、收入低”。可能是 2,接下来的 4,等等。

我想弄清楚是否有一种方法可以保持输出的一致性。数据集会更新,因此每次都不会相同,而且由于即使对于相同的数据集,R 也无法保持簇顺序一致,我想知道这是否可能。

感谢任何人可以提供的帮助。就我而言,我当前的想法是将 $centers 数据输出到 SQL 表,然后按各种指标对表进行排序,每次都将最高/最低的指标标记为这样,然后连接结果以标记级别。这可能有效,但不太优雅。

最佳答案

我知道这是一篇很老的帖子,但我现在才看到它。我今天遇到了同样的问题,并根据 Barker 的建议提出了解决方案:

library(dplyr)

# create a random data frame
df <- data.frame(id = 1:10, obs = sample(0:500, 10))

# use kmeans a first time to get the centers
centers <- kmeans(df$obs, centers = 3)$centers

# order the centers
centers <- sort(centers)

# call kmeans again but this time passing the centers calculated in the previous step
clusteridx <- kmeans(df$obs, centers = centers)$cluster

不是很优雅,但它可以工作。 clusteridx 向量将始终根据中心按升序返回簇编号。

如果您愿意,也可以将其折叠为一行:

clusteridx <- kmeans(df$obs, centers = sort(kmeans(df$obs, centers = 3)$centers))$cluster

关于r - R 中 Kmeans 的一致簇顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39906180/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com