首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中使用Kmeans保持一致的聚类顺序

在R中使用Kmeans保持一致的聚类顺序
EN

Stack Overflow用户
提问于 2016-10-07 01:47:32
回答 5查看 5.5K关注 0票数 6

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

背景是,我有一个关于不同城市的信息数据库,比如名字,人口,污染,犯罪等。我对它进行查询以聚合每个城市的数据,并将结果输出到一个表中。这很好用。

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

我遇到的问题是这些集群有不同的含义/解释,所以我想用集群对该行的解释来标记原始数据集中的每一行,而不是集群编号。所以我不想把第二排和“集群5”联系起来,我想说“低人口,高犯罪率,低收入”。

如果R以相同的顺序输出集群,假设集群5总是等同于具有“低人口,高犯罪率,低收入”的城市集群,这将工作得很好,但它不是这样的。例如,如果你像这样运行代码:

代码语言:javascript
复制
> a =  kmeans(city_date,centers=5)
> b =  kmeans(city_date,centers=5)
> c =  kmeans(city_date,centers=5)

运行此代码:

代码语言:javascript
复制
a$centers
b$centers
c$centers

集群将包含相同的数据集,但集群编号将不同。因此,如果我在SQL中有一个具有聚类编号和解释的映射表,它将不起作用,因为当我有一天运行它时,它可能会有“低人口,高犯罪,低收入”聚类为5,下一天它可能是2,下一个4,等等。

我想知道的是,是否有一种方法可以保持输出的一致性。数据集被更新了,所以它甚至不会每次都是相同的,而且由于R即使对于相同的数据集也不能保持集群顺序的一致性,我想知道这是否可能。

感谢任何人能提供的任何帮助。我现在的想法是将$centers数据输出到一个SQL表中,然后根据不同的指标对表进行排序,每次将最高/最低的指标标记为最高/最低的指标,然后将结果连接起来以标记级别。这可能行得通,但不是很优雅。

EN

回答 5

Stack Overflow用户

发布于 2018-01-18 05:08:35

我知道这是一个非常古老的帖子,但我现在才接触到它。今天我也遇到了同样的问题,我采用了Barker的建议,提出了一个解决方案:

代码语言:javascript
复制
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向量将始终以升序返回基于中心的簇号。

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

代码语言:javascript
复制
clusteridx <- kmeans(df$obs, centers = sort(kmeans(df$obs, centers = 3)$centers))$cluster
票数 9
EN

Stack Overflow用户

发布于 2016-10-07 01:50:42

通常,k-means被随机初始化几次,以避免局部最小值。如果您希望对结果簇进行排序,则必须在k-means算法停止工作后手动对它们进行排序。

票数 1
EN

Stack Overflow用户

发布于 2016-10-07 06:12:32

我自己没有这样做过,所以我不确定它是否可以工作,但是kmeans有这样的参数:

  • centers -集群的数量,例如k,或一组初始(不同的)集群中心。如果是一个数字,则选择x中的一组随机的(不同的)行作为初始中心。

如果您知道基本上知道集群应该在哪里(可能是通过从要匹配的数据集中获取集群中心),则可以使用它来初始化模型。这将使起始位置不是随机的,因此集群应该保持相同的顺序。此外,作为一个额外的好处,将集群中心初始化到它们将结束的地方应该会加快集群的速度。

编辑

我只是使用kmeans示例中的数据进行了检查,但是在(1,1)使用第一个数据点进行初始化,在(0,0)使用第二个数据点进行初始化(用于构建集群的分布的均值),如下所示。

代码语言:javascript
复制
x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2),
           matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))
colnames(x) <- c("x", "y")
(cl <- kmeans(x, matrix(c(1,0,1,0),ncol=2)))
plot(x, col = cl$cluster)
points(cl$centers, col = 1:2, pch = 8, cex = 2)

经过反复运行,我发现第一个集群总是在右上角,第二个集群在左下角,初始化2集群会导致then来回切换。如果你对你的集群有一些近似的起始值(即“低人口,高犯罪,低收入”的量化),这可能是你的初始化,并给你你想要的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39906180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档