如何从 flexclust 生成集群的性能统计信息?

How to generate performance stats of clustering from flexclust?

在尝试了一些聚类算法后,我在使用 flexclust::kccafamily = kccaFamily("angle") 的数据集上获得了最佳性能。

这是一个使用来自 flexclust.

Nclus 数据集的示例
library(fpc)
library(flexclust)
data(Nclus)

k <- 4
family <- flexclust::kccaFamily("angle")
model <- flexclust::kcca(Nclus, k, family)

现在我想优化集群的数量。集群模型最全面的性能指标集似乎可以使用 fpc::cluster.stats 找到。此函数需要两个输入:距离矩阵和分配的集群。

后者容易;它只是 model@cluster.

我正在努力为距离矩阵提供什么。 kcca 不是 return 距离对象(或者如果是,我还没有找到它)。

我想我通常会使用 dist(Nclus)。在这种情况下,我不需要欧几里得距离(或 dist 可用的任何其他方法)——我想要聚类算法使用的距离度量。我可以使用该函数的代码重新创建 kcca 使用的距离矩阵。

control <- as(list(), "flexclustControl")
centers <- flexclust:::initCenters(Nclus, k, family, control)
distmat <- distAngle(Nclus, centers$centers)

然后我应该能够使用

计算集群模型统计数据
fpc::cluster.stats(distmat, model@cluster)

麻烦的是它给了我两个关于距离参数的警告。

Warning messages:
1: In as.dist.default(d) : non-square matrix
2: In as.matrix.dist(d) :
  number of items to replace is not a multiple of replacement length

这让我怀疑我给错了。

我应该如何将距离矩阵传递给cluster.stats

我猜你应该使用

distmat <- distAngle(Nclus, Nclus)

但是,我不确定从建模的角度来看这是否有意义:要检查聚类输出的性能,您应该使用更适合您的特定用例的指标;这可能(也可能不是)L1 距离:

distmat <- dist(Nclus, "manhattan")

特别是,我猜想最小化 "angle between observation and centroid / standardized mean" 与最小化观测值之间的簇内角度不同;我也猜想后一个数量对于建模目的并不是特别有用。换句话说,我将 distAngle 视为识别 k 个集群的替代方法 ("trick"),但我随后会通过其他指标评估已识别的集群。希望这对你有意义...