如何从flexclust生成聚类的性能统计数据?

Ric*_*ton 12 r cluster-analysis

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

以下是使用Nclus数据集的示例flexclust.

library(fpc)
library(flexclust)
data(Nclus)

k <- 4
family <- flexclust::kccaFamily("angle")
model <- flexclust::kcca(Nclus, k, family)
Run Code Online (Sandbox Code Playgroud)

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

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

我正在努力为距离矩阵提供什么. kcca不返回距离物体(或者如果它没有,我还没有找到它).

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

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

然后我应该能够使用计算集群模型统计数据

fpc::cluster.stats(distmat, model@cluster)
Run Code Online (Sandbox Code Playgroud)

麻烦在于给我两个关于距离论证的警告.

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
Run Code Online (Sandbox Code Playgroud)

这让我怀疑我给它错了.

我应该如何通过距离矩阵cluster.stats

ren*_*olo 3

我想你应该使用

distmat <- distAngle(Nclus, Nclus)
Run Code Online (Sandbox Code Playgroud)

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

distmat <- dist(Nclus, "manhattan")
Run Code Online (Sandbox Code Playgroud)

特别是,我猜测最小化“观察与质心/标准化平均值之间的角度”与最小化观察之间的簇内角度不同;我还猜测后一个量对于建模目的并不是特别有用。换句话说,我将 distAngle 视为识别 k 个集群的替代方法(“技巧”),但随后我会通过其他指标评估已识别的集群。希望这对你有意义......

  • 我同意雷纳托的观点。问题是“cluster.stats()”需要一个对称的成对距离矩阵,其中每个元素都与其他每个元素进行比较(例如“as.matrix(dist(Nclus))”)。然而,“distAngle(Nclus,centers$centers)”表达式将数据点与簇质心进行比较,因此您得到一个非对称距离矩阵。因此,您需要使用不同的距离度量,例如 renato 建议的 L1 距离,或者找到不同的方法来评估集群分配。 (2认同)