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