scikit learn中的聚类惯性公式

机器算法验证 聚类 Python k-均值 scikit-学习 公制
2022-03-11 07:37:55

我想使用 pandas 和 scikit learn 在 python 中编写一个 kmeans 聚类。为了选择好的 k,我想对 Tibshirani 和 al 2001 ( pdf ) 的 Gap Statistic 进行编码。

我想知道我是否可以使用scikit 的惯性结果并调整间隙统计公式,而无需重新编码所有距离计算。

有谁知道 scikit 中使用的惯性公式/知道使用高级距离函数重新编码间隙统计的简单方法?

1个回答

我想我找到了 kmeans 聚类的答案:

通过查看 git 源代码,我发现对于 scikit learn,惯性计算为每个点到其最近的质心(即其分配的集群)的平方距离之和。所以I=i(d(i,cr))在哪里cr是分配集群的质心,并且d是平方距离。

现在差距统计的公式涉及

Wk=r=1k1(2nr)Dr
在哪里Dr是簇中所有点之间的平方距离之和r.

通过介绍+c,c在平方距离公式中(c是集群的质心r坐标),我有一个对应于惯性的术语(如在 scikit 中)+一个术语,如果每个c是每个簇的重心(应该是 kmeans)。所以我猜Wk实际上是 scikit Inertia。

我还有两个问题:

  1. 你认为我的微积分是正确的吗?(例如,我不知道它是否适用于层次聚类。)
  2. 如果我在上面是正确的,我已经编码了差距统计(作为估计和聚类之间的对数惯性的差异)并且它表现得很糟糕,特别是在 iris 数据集上,有人试过吗?