如何使用 Gap 统计在层次聚类中找到最佳聚类数?

How to find optimal number of clusters in hierarchical clustering using Gap statistic?

我想 运行 使用单个 linkage 进行层次聚类,以对具有 300 个特征和 1500 个观察值的文档进行聚类。我想找到这个问题的最佳簇数。

下面的 link 使用下面的代码来查找具有最大间隙的簇数。

http://www.sthda.com/english/wiki/determining-the-optimal-number-of-clusters-3-must-known-methods-unsupervised-machine-learning

# Compute gap statistic 
set.seed(123)

iris.scaled <- scale(iris[, -5])

gap_stat <- clusGap(iris.scaled, FUN = hcut, K.max = 10, B = 50)

# Plot gap statistic 
fviz_gap_stat(gap_stat)

但是在link中hcut没有明确定义。如何为 clusGap() 函数指定单个 linkage 层次聚类?

我们在 python 中是否有 clusGap() 的等价物?

谢谢

hcut() 函数是您发布的 link 中使用的 factorextra 包的一部分:

hcut package:factoextra R Documentation

Computes Hierarchical Clustering and Cut the Tree

Description:

 Computes hierarchical clustering (hclust, agnes, diana) and cut
 the tree into k clusters. It also accepts correlation based
 distance measure methods such as "pearson", "spearman" and
 "kendall".

R 还有一个内置函数,hclust(),可用于执行层次聚类。但是,默认情况下,它不会执行单一 linkage 聚类,因此您不能简单地将 hcut 替换为 hclust.

但是,如果您查看 clusGap() 的帮助,您会发现可以提供要应用的自定义聚类函数:

FUNcluster: a ‘function’ which accepts as first argument a (data) matrix like ‘x’, second argument, say k, k >= 2, the number of clusters desired, and returns a ‘list’ with a component named (or shortened to) ‘cluster’ which is a vector of length ‘n = nrow(x)’ of integers in ‘1:k’ determining the clustering or grouping of the ‘n’ observations.

hclust()函数可以进行单linkage层级聚类,所以你可以:

cluster_fun <- function(x, k) list(cluster=cutree(hclust(dist(x), method="single"), k=k))
gap_stat <- clusGap(iris.scaled, FUN=cluster_fun, K.max=10, B=50)