【问题标题】:How to generate performance stats of clustering from flexclust?如何从 flexclust 生成集群的性能统计信息?
【发布时间】:2016-12-08 17:37:56
【问题描述】:

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

这是一个使用来自flexclustNclus 数据集的示例。

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

【问题讨论】:

  • 顺便提一下,fpc::cluster.stats 需要大量内存,因此即使是中等大小的数据集也不实用。最后我选择了cluster::silhouette

标签: r cluster-analysis


【解决方案1】:

我猜你应该使用

distmat <- distAngle(Nclus, Nclus)

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

distmat <- dist(Nclus, "manhattan")

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

【讨论】:

  • 我同意雷纳托。问题是cluster.stats() 需要一个对称的成对距离矩阵,其中每个元素都与其他元素进行比较(例如as.matrix(dist(Nclus)))。然而,distAngle(Nclus, centers$centers) 表达式将数据点与集群质心进行比较,因此您得到一个非对称距离矩阵。因此,您需要使用不同的距离度量,例如 renato 建议的 L1 距离,或者找到不同的方法来评估集群分配。
猜你喜欢
  • 1970-01-01
  • 2014-10-18
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 2016-05-21
  • 2017-12-23
相关资源
最近更新 更多