【问题标题】:Should we used k-means++ instead of k-means?我们应该使用 k-means++ 而不是 k-means 吗?
【发布时间】:2011-06-10 01:14:26
【问题描述】:

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

  1. 原始 k-means 算法在输入大小上具有超多项式的最坏情况运行时间,而 k-means++ 声称为 O(log k)。
  2. 与最佳聚类相比,找到的近似值在目标函数方面可能会产生不太令人满意的结果。

但是 k-means++ 有什么缺点吗?从现在开始,我们是否应该一直使用它而不是 k-means?

【问题讨论】:

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


    【解决方案1】:

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

    我不确定 k-means++ 的最坏情况运行时间是多少;请注意,在Arthur & Vassilvitskii's 原始描述中,算法的步骤 2-4 参考劳埃德算法。他们确实声称它在实践中工作得更好更快,因为它从一个更好的位置开始。

    k-means++的缺点如下:

    1. 它也可以找到次优解决方案(它仍然是一个近似值)。
    2. 它并不总是比 Lloyd 的算法快(请参阅 Arthur 和 Vassilvitskii 的表格)。
    3. 它比 Lloyd 的算法复杂。
    4. 它相对较新,而 Lloyd's 已经证明它的价值已超过 50 年。
    5. 对于特定的度量空间,可能存在更好的算法。

    也就是说,如果您的 k-means 库支持 k-means++,那么请务必尝试一下。

    【讨论】:

    • 只是挑剔。它是与最优竞争的 log K,而不是与 Lloyd's 竞争的。事实上,LLoyd 的最优值可能是任意差的,并且没有合理的近似保证。
    • @Suresh:这不是吹毛求疵,而是我的想法。已更正。
    【解决方案2】:

    不是您的问题,而是对大 N 的任何 kmeans 方法的简单加速:

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

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

    您的 N(数据点数)、dim(特征数)和 k 是多少?
    用户的 N、dim、k、数据噪声、指标的巨大范围...... 更不用说缺乏公共基准,很难比较方法。

    添加:kmeans() 和 kmeanssample() 的 Python 代码是 here 在 SO 上;欢迎 cmets。

    【讨论】:

    • Bradley 和 Fayyad 的论文“Refining Initial Points for K-Means Clustering (1998)”更详细地描述了类似的技术:citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.44.5872
    • 感谢预测器;你用过这个吗? (好的想法会被重新发现,不太好的想法也会被重新发现。)
    • 您是否尝试过先在随机样本上运行 k-means++,然后再进行精炼?
    • @Anony-Mousse,听起来很合理,但我没有。纠正我,数据集差异如此之大,以至于说“在像 Y 这样的数据上使用变体 X”是不可能的?
    • 嗯,k-means++ 是一种比仅选择随机对象更聪明的方法来播种几乎任何类型的数据。所以实际上没有理由不总是使用 k-means++,除非你有特定领域的启发式方法来选择更好的种子。
    猜你喜欢
    • 1970-01-01
    • 2013-07-03
    • 2020-03-03
    • 1970-01-01
    • 2013-07-03
    • 2016-01-07
    • 2010-12-11
    • 2021-01-27
    • 2017-05-17
    相关资源
    最近更新 更多