【问题标题】:MATLAB kMeans does not always converge to global minimaMATLAB kMeans 并不总是收敛到全局最小值
【发布时间】:2011-04-09 03:19:53
【问题描述】:

我在 MATLAB 中编写了一个 k-Means clustering 算法,我想我会在 kmeans(X,k) 中构建的 MATLAB 上进行尝试。

但是,对于非常简单的四集群设置(见图),MATLAB kMeans 并不总是收敛到最优解(左)而是(右)。

我写的也不总是这样,但是内置函数不应该能够解决这么简单的问题,总能找到最优解吗?

【问题讨论】:

    标签: matlab machine-learning cluster-analysis k-means


    【解决方案1】:

    我认为这不是一个简单的问题。:) 事实上,关于“k-means clustering”的 Wikipedia 文章对计算复杂性给出了相当悲观的描述。

    如果您想摆脱随机重启(依赖于初始猜测),折衷方案是“全局 k-means”算法;论文和matlab代码可以在这里找到:http://lear.inrialpes.fr/~verbeek/software.php

    【讨论】:

      【解决方案2】:

      虽然K-Means++ 不会在一次运行中解决问题,但它在运行 N 次时往往会给出更好的结果(与运行原始 K-Means 算法 N 次相比)。

      【讨论】:

      • 是的,我在 wiki 上阅读了有关 kMeans++ 算法的信息,但我并不真正了解初始集群是如何启动的......
      【解决方案3】:

      您可能经常会对“k-means 算法”(即 Lloyd 算法)的任何特定运行所提出的解决方案感到失望。那是因为劳埃德算法经常陷入糟糕的局部最小值。

      幸运的是,Lloyd's 只是解决 k-means 的一种方法。还有一种方法几乎总能找到更好的局部最小值。

      诀窍是一次更新一个数据点的集群分配。您可以通过计算分配给每个平均值的点数 n 来有效地做到这一点。这样你就可以在删除点x后重新计算聚类平均值m,如下所示:

      m_new = (n * m - x) / (n - 1)
      

      并将x 添加到集群均值m 使用:

      m_new = (n * m + x) / (n + 1)
      

      当然因为不能向量化,所以在MATLAB中运行有点痛苦,但在其他语言中也不算太差。

      如果您真的热衷于获得可能的最佳局部最小值,并且您不介意使用基于示例的聚类,您应该查看affinity propagationFrey lab affinity propagation page 上提供了 MATLAB 实现。

      【讨论】:

        【解决方案4】:

        正如@Alexandre C. 解释的那样,K-means 算法依赖于初始簇质心位置,并不能保证它会收敛到最优解。

        你能做的最好的事情就是用随机的起点重复实验几次。

        MATLAB 的实现提供了这样一个选项:replicates,它会重复聚类 N 次,并选择具有最低总聚类内点到质心距离的那个。 您还可以使用start 选项控制如何选择初始质心。

        此外,MATLAB 提供了多种距离度量(欧几里得、曼哈顿、余弦等)的选择。一个简洁的选项emptyaction 允许您控制当集群在迭代期间失去所有分配的成员时会发生什么。

        但真正的优势在于它采用了两阶段算法:通常的分配-重新计算迭代,然后是在线更新阶段。请务必阅读documentation page 的算法部分了解更多信息。

        【讨论】:

          【解决方案5】:

          k-means 算法对聚类中心的初始猜测非常敏感。您是否尝试过使用 相同 初始质量中心的两种代码?

          算法很简单,我怀疑你的实现和 Matlab 的有很大差异。

          【讨论】:

          • 我猜你是对的。为了获得更好的收敛性,我修改了我的算法,用不同的初始质心进行了几次尝试,然后通过测量集群的方差来确定最佳的一次。尝试中的低平均方差等于紧凑的集群。听起来怎么样?
          • @Theodor:这确实是一个可能的标准。
          猜你喜欢
          • 2018-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-08
          相关资源
          最近更新 更多