R:如何从树状图中获得大小大致相同的簇

R: How to get clusters of roughly the same size from dendrogram

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

我使用了 R 的 hclust() 函数并得到了一个非常好的树状图 - 所以它工作得很好 - 但是当我尝试使用 cutree() 设置聚类时,我可以调整 h (树的高度)或 k(所需的组大小)。问题是,即使我将我的组大小设置为某个值,我得到的一些组要小得多。

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

为了防止这种情况,我想做的是“禁止”某个最小规模的群组,因此如果有这样的群组,它们将被添加到另一个小组或类似的群组。有没有一种简单的方法可以做到这一点,还是我必须编写自己的函数来在聚类后进行一些清理?

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

提前感谢您的意见!

山石色

正如 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)