问题描述
我试图按学生的兴趣对他们进行分组。小组的大小应该大致相同,即使这意味着有些学生如果不适合任何小组,也不会真正与小组成员分享兴趣。
我使用了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)