在尝试了几种聚类算法之后,使用flexclust::kcca
和可以使数据集获得最佳性能family = kccaFamily("angle")
。
这是使用中的Nclus
数据集的示例flexclust
。
library(fpc)
library(flexclust)
data(Nclus)
k <- 4
family <- flexclust::kccaFamily("angle")
model <- flexclust::kcca(Nclus, k, family)
现在,我想优化集群的数量。似乎可以使用来找到针对群集模型的最全面的性能指标集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)
然后我应该能够使用
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")
特别是,我想最小化“观测值和质心/标准化均值之间的角度”与最小化观测值之间的集群内角度是不一样的。而且我猜想后者对于建模目的并不是特别有用。换句话说,我将distAngle作为识别k个聚类的替代方法(“技巧”),但随后我将通过其他指标来评估识别出的聚类。希望这对您有意义...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句