我们应该使用k-means ++而不是k-means吗?

时间:2011-01-16 16:53:56

标签: algorithm performance comparison cluster-analysis k-means

k-means++算法有助于原始k-means算法的以下两点:

  1. 原始k-means算法在输入大小中具有超级多项式的最差情况运行时间,而k-means ++声称为O(log k)。
  2. 与最佳聚类相比,发现的近似值在目标函数方面可能产生不太令人满意的结果。
  3. 但是k-means ++有什么缺点吗?从现在开始我们应该总是使用它而不是k-means吗?

2 个答案:

答案 0 :(得分:16)

没有人声称k-means++在O(lg k )时间内运行;它的解决方案质量是O(lg k ) - 与最佳解决方案竞争。 k -means ++和常用方法(称为Lloyd算法)都是NP-hard优化问题的近似值。

我不确定 k -means ++的最坏情况运行时间是多少;请注意,在Arthur & Vassilvitskii's原始描述中,算法的步骤2-4涉及Lloyd的算法。他们确实声称它在实践中既更好又更快,因为它从更好的位置开始。

k -means ++的缺点是:

  1. 它也可以找到一个次优的解决方案(它仍然是一个近似值)。
  2. 它并不比Lloyd的算法更快(参见Arthur& Vassilvitskii的表格)。
  3. 这比Lloyd的算法更复杂。
  4. 这是相对较新的,而劳埃德已证明它的价值超过50年。
  5. 特定度量标准空间可能存在更好的算法。
  6. 也就是说,如果您的 k -means库支持 k -means ++,那么请务必尝试一下。

答案 1 :(得分:7)

不是你的问题,但对于大型N的任何kmeans方法都很容易加速:

1)首先对点数为sqrt(N)的随机样本进行k均值 2)然后从这些中心运行完整的k-means。

我发现这比Kmeans ++快5到10倍,对于N 10000,k 20,结果相似 它的效果如何取决于sqrt(N)样本的效果 近似整体,以及N,dim,k,ninit,delta ......

你的N(数据点数),暗淡(特征数量)和k是什么? 用户的N,dim,k,数据噪声,指标的巨大范围...... 更不用说缺乏公共基准,难以比较方法。

补充:kmeans()和kmeanssample()的Python代码是 here关于SO;欢迎提出意见。