【发布时间】:2016-02-13 20:23:55
【问题描述】:
我对 K-Means 聚类技术非常陌生。我想计算 K-Means 的 BIC 以找到最佳 K(簇数)。我在网上四处寻找python中的解决方案,但除了this thread之外没有具体的例子,我不确定它是否正确。有什么想法吗?
【问题讨论】:
-
那么,您是否尝试过在 Python 中实现这些功能?
我对 K-Means 聚类技术非常陌生。我想计算 K-Means 的 BIC 以找到最佳 K(簇数)。我在网上四处寻找python中的解决方案,但除了this thread之外没有具体的例子,我不确定它是否正确。有什么想法吗?
【问题讨论】:
BIC 基本上是一种(合理的)启发式
BIC(theta|x, n) = -2 ln L(x|theta) + params(theta) lg n
其中x 是样本,n 是样本数,theta 是您的模型,params(theta) 是估计参数的数量,L 是与您的模型相关的似然函数,因此您需要 概率模型,分配概率 (ln L(x|theta) = ln PROD_{i=1}^n P(x|theta) = SUM_{i=1}^d ln P(x|theta))。事实上,虽然计算参数很容易(因为它只是 K*d,其中 K 是来自 K-means 的 K 和空间的 d 维),但您无法真正计算概率,因为 K-means 没有为您提供概率直接建模。
另一方面,您实际上可以证明 (http://mlg.eng.cam.ac.uk/teaching/3f3/1011/lect4.pdf) 存在等效的概率方法,从而导致相同的成本函数。因此,即使您首先拟合的是非概率模型,您也可以在拟合 k-means 后轻松恢复实际概率模型的解。
例如,正确的 python 实现位于:https://github.com/mynameisfiber/pyxmeans/blob/master/pyxmeans/xmeans.py(他们的_loglikelihood 函数是上面等式中的ln L(x|theta))。
【讨论】: