R 中给定聚类计算 Calinski-Harabasz 指数的不一致

机器算法验证 r 聚类
2022-04-15 03:22:56

我有兴趣确定使用 Calinski-Harabasz (CH) 索引的 PAM 聚类算法计算的最佳聚类数。为此,我发现 2 个不同的 R 函数计算给定聚类的 CH 值,但返回不同的结果:?cluster.stats(在fpc 包中)和?index.G1(在clusterSim中)。

第一个通过以下方式调用:

pam.res <- pam(dist.matrix, 2, diss=TRUE)
ch1     <- cluster.stats(dist.matrix, pam.res$clustering, silhouette=TRUE)$ch

第二个通过以下方式调用:

ch2 <- index.G1(t(dataframe), pam.res$clustering, d=dist.matrix)

数据可以在这里找到: dataframe.RData,或者在这里:dist.matrix.RData [死链接]。

  • 任何人都可以向我解释这两个 CH 指数计算之间的区别吗?

    使用cluster.stats(),获得 2 个簇的最高 CH 索引();在使用时,获得了 3 个集群的最高 CH 指数(完全不同)。32index.G1()6054

  • 通常使用哪个函数来计算 CH 指数?

2个回答

对于相同的距离矩阵,有一种计算 Caliński & Harabasz (1974) 指数的方法,因此如果两个 R 函数显示不同的结果,其中一个是错误的。因此,您的问题是题外话

  • 看看 Caliński & Harabasz 指数是如何计算的,在他们的原始论文 [1] 或例如这里

  • 然后检查两个 R 函数的源代码,找到一个错误并将其报告给包创建者

以下是GitHub 上的示例站点,您可以在其中查看源代码: fpchttps ://github.com/cran/fpc/tree/master/R、https : //github.com/cran/clusterSimclusterSim

[1] Caliński, T. 和 J. Harabasz。“用于聚类分析的树突方法。” 统计通讯。卷。3,第 1 期,1974 年,第 1-27 页。

使用包含 200 个点、欧几里得距离和完整链接的合成二维数据集,我无法重现您遇到的差异。clusterCrit包和另一个实现也返回相同的值

> # fpc
> ch1 <- calinhara(X, pc, cn=max(pc))
> # clusterSim
> ch2 <- index.G1 (X,pc,d=NULL,centrotypes="centroids")
> # clusterCrit
> ch3 <- as.numeric(intCriteria(X,pc,"Calinski_Harabasz"))
> 
> cat('fpc: ', ch1, '\nclusterSim: ', ch2, '\nclusterCrit: ', ch3)
fpc:  369.0315 
clusterSim:  369.0315 
clusterCrit:  369.0315

Python

>>> itn.calinski_harabasz(X, pc)
369.0315384638188