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

问题描述

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

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

如果您看图中的树,有些学生的兴趣与其他人完全不同,所以我想这就是它发生的原因。

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

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

谢谢您的输入!

梅尔

解决方法

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

您可以使用anticlust包中的函数balanced_clustering()来创建大小相等的簇。这是一个使用虹膜数据集的示例:

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[,p = 5)