【问题标题】:R: How to get clusters of roughly the same size from dendrogramR:如何从树状图中获得大致相同大小的集群
【发布时间】:2020-11-03 01:45:29
【问题描述】:

我尝试按学生的兴趣对他们进行分组。这些小组的规模应该大致相同,即使这意味着如果某些学生不适合任何小组,他们就不会真正与小组成员分享兴趣。

我使用了 R 的 hclust() 函数并得到了一个非常漂亮的树状图 - 所以效果很好 - 但是当我尝试使用 cutree() 设置集群时,我可以调整 h(树的高度)或 @ 987654325@(所需的组大小)。问题是,即使我将组大小设置为某个值,我也会得到一些更小的组。

如果你看一下绘制的树,有些学生的兴趣与其他学生完全不同,所以我想这就是它发生的原因。

为了防止这种情况,我想做的是“禁止”具有一定最小规模的组,所以如果有这样的组,它们会被添加到另一个小组或类似的东西中。有没有一种简单的方法可以做到这一点,还是我必须编写自己的函数来在集群后清理一下?

我在 StackOverflow 上发现了类似的问题(例如 this one),但它们都没有被标记为已回答,在我提到的特定情况下,恐怕我并没有真正得到建议的解决方案。

提前感谢您的意见!

梅尔

【问题讨论】:

  • 如果您并不真正需要“分层”聚类方法,而只是想将您的学生分成大小相等的组,您可以查看 anticlust 包中的函数 balanced_clustering() . (或者matching() 在同一个包中,它的作用几乎相同,但您可以指定组的大小而不是集群的数量)。
  • 哦,这听起来正是我需要的!谢谢!!!
  • 好的,那我把这个添加为答案。
  • 再次感谢,这就像魔术一样!
  • 作为包的作者,很高兴知道这一点:D

标签: r cluster-analysis hierarchical-clustering


【解决方案1】:

正如 Merle 在评论中指出的那样,解决方案不必基于层次聚类方法。

您可以使用anticlust 包中的函数balanced_clustering() 创建大小相等的集群。这是一个使用 iris 数据集的例子:

library(anticlust)

data(iris)

iris$group <- balanced_clustering(
  iris[, -5],
  K = nrow(iris) / 5 # 5 plants per group
)

输出是表示组成员身份的向量。例如,这是一组相似的植物:

subset(iris, group == 1)
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species group
#> 1           5.1         3.5          1.4         0.2  setosa     1
#> 5           5.0         3.6          1.4         0.2  setosa     1
#> 8           5.0         3.4          1.5         0.2  setosa     1
#> 18          5.1         3.5          1.4         0.3  setosa     1
#> 40          5.1         3.4          1.5         0.2  setosa     1

请注意,我使用四个数字标准进行聚类,而不是“物种”。

同样可以使用anticlust::matching() 来指定组的大小,但是:

matching(iris[, -5], p = 5) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    相关资源
    最近更新 更多