在 R 中,是不是有一种算法可以创建大小大致相等的集群

Posted

技术标签:

【中文标题】在 R 中,是不是有一种算法可以创建大小大致相等的集群【英文标题】:In R, is there an algorithm to create approximately equal sized clusters在 R 中,是否有一种算法可以创建大小大致相等的集群 【发布时间】:2015-03-04 11:45:30 【问题描述】:

似乎有很多关于创建分层或 k-means 集群的信息。但我想知道 R 中是否有一个解决方案可以创建大约相等大小的 K 个集群。有一些关于在其他语言中执行此操作的内容,但我无法通过互联网搜索找到任何建议如何在 R 中实现结果的内容。

一个例子是

set.seed(123)
df <- matrix(rnorm(100*5), nrow=100)
km <- kmeans(df, 10)
print(sapply(1:10, function(n) sum(km$cluster==n)))

导致

[1] 14 12  4 13 16  6  8  7 13  7

我最希望看到

[1] 10 10 10 10 10 10 10 10 10 10 

【问题讨论】:

我所能做的就是将您推荐给cran.r-project.org/web/views/Cluster.html,以获取与集群相关的软件包的完整列表。不过,我希望熟悉这个问题的人能给你一个特别的建议。 我相信 Ward 集群会产生更相等大小的集群。尝试使用hclust(d, method="ward.D")hclust(d, method="ward.D2") 谢谢你和 jaysunice。 Jaysunice,我明天会调查的。 我已经编辑了我的问题,但我不太清楚为什么我被搁置,除非我明白我隐含地打破了上面的“要求工具或软件库”部分。但是,如果是这种情况,所有 R 问题中有一半都在做同样的事情。如何要求可能在某个库中或可能不在某个库中的特定类型的聚类,与要求转换日期的函数或执行特定类型的图表(这将需要一个库)或组合两个表(需要一个图书馆),除了我的问题需要一些难以搜索的知识水平 【参考方案1】:

我认为你不应该,首先。为什么?当您的数据中存在自然格式良好的集群时,例如,

plot(matrix(c(sample(1:10,10),sample(30:40, 7), sample(80:90,9)), ncol=2, byrow = F))

那么这些无论如何都会聚集在一起(假设 k 等于簇的自然 n;请参阅this comprehensive answer 了解如何选择好的 k)。如果它们的大小一致,那么您将拥有 ~ 大小相等的集群;如果不是,那么强制使用统一的集群大小肯定会降低集群解决方案的适应度。 如果您的数据中没有自然漂亮的集群,例如,

plot(matrix(c(sample(1:100, 100), ncol=2)))

然后强制集群大小将是冗余的(如果数据是完全随机的,集群大小将是〜相等的 - 但无论如何集群没有多大意义),或者如果那里有一些不错的集群,例如,

plot(matrix(c(sample(1:15,15),sample(20:100, 11)), ncol=2, byrow = T))

那么强制大小几乎肯定会破坏它们。

但是,JasonAizkalns 在 cmets 中提到的 Ward 方法会为您提供比单链接更多“圆形”形状的集群,因此这可能是一种可行的方法(参见 help(hclust) 之间的区别D和D2,不是任意的)。

【讨论】:

(-1) 不回答问题。假设您有来自 n 个混合信号的数据,平均采样 m 次。人们可能希望将数据聚集成 n 个大小相等的集群。【参考方案2】:

不完全清楚你在问什么,但在 R 中生成随机数据非常容易。如果你的数据集有两个维度,你可以做这样的事情 -

cluster1 = data.frame(x = rnorm(100, mean=5,sd=1), y  = rnorm(100, mean=5,sd=1))
cluster2 = data.frame(x = rnorm(100, mean=15,sd=1), y  = rnorm(100, mean=15,sd=1))

这会为每个集群中的 100 个数据点生成跨 x 和 y 的正态分布随机数据。

然后查看它-

plot(cluster1, xlim = c(0,25), ylim = c(0,25))
lines(cluster2, type = "p")!

【讨论】:

我想你不知道什么是聚类分析。想象一下有 200 个点的数据,OP 想要一个将这些点标记为两个集群的过程,每个集群有 100 个。 我愿意...我以为他想生成数据然后出于任何原因进行聚类分析。

以上是关于在 R 中,是不是有一种算法可以创建大小大致相等的集群的主要内容,如果未能解决你的问题,请参考以下文章

排序与搜索

是否有一种算法可以在图像中找到已知大小和形状的对象?

4-1 排序与搜索

用于获得相等大小的聚类的聚类算法

是否有一种快速算法可以将集合的所有分区生成为大小为 2 的子集(和一个大小为 1 的子集)?

将数字列表分成大致相等的总数