【问题标题】:k-means algorithm in Matlab giving wrong answer?Matlab中的k-means算法给出错误答案?
【发布时间】:2019-02-19 23:53:29
【问题描述】:

我有以下疑问: 我正在使用 Matlab 的 k-means 函数,我只想使用 vanilla Lloyd 算法,以及我想要的一组初始化点。我使用以下代码,其中“开始”是我的初始化向量。

kmeans(data,[],'Start',start, 'OnlinePhase', 'off');

假设我的数据是 (-2,-1)X(2,1) 范围内的二维数据,我将起点初始化为 (-10,0) 和 (0,0)。理想情况下,我应该在一个集群中获得所有点,而在其他集群中没有,但是我在答案中获得了两个集群(因为 (-10,0) 真的很远,所以它应该在一次迭代中收敛)。这怎么可能?我在 Matlab 网站上阅读了 k-means 算法的描述,似乎这不应该是答案。

【问题讨论】:

  • 0分是什么意思?这就是在第一次迭代后将一个质心转移到的地方......构建测试以确保初始化正确,如果不正确则忽略它似乎是合乎逻辑的。
  • “构建一个测试以确保初始化正确似乎是合乎逻辑的”,构建一个测试?
  • 一个测试,如:一个给定质心的平均值是 0/0=NaN,不能用它来计算,让我们使用我们的默认初始化来代替。
  • @CrisLuego 可以将空集群保留在原来的位置。也许您正在使用有关中心的先前知识进行聚类,并且您的初始类之一没有出现在新样本中。那么该类应该保持为空,并且集群可能不应该移动。
  • 我认为@CrisLuengo 可能是对的,如果有一些糟糕的初始化,那么Matlab 的kmeans 算法可能会选择默认初始化。

标签: matlab cluster-analysis k-means


【解决方案1】:

没有一个点最接近错误选择的中心。因此无法重新计算,并将被新中心替换(请参阅文档)。首先将所有点分配给 0,0 簇。一些算法甚至会因为除以 0 而失败,或者丢弃这个中心并减少到 k=1。在 Matlab 中,您可以选择处理 - 默认情况下,它将选择距离所有中心最远的点作为替换。

在相当合理的地方保留一个空的集群中心,恕我直言,因为它不会改变您在选择初始中心时想到的任何集群枚举,并且(当初始中心选择得当时)它甚至可能变成当其他中心继续移动时(虽然不是在这里),最终又非空了。

【讨论】:

  • 可以,而且实现空簇的方式是matlab是kmeans(data,[],'Start',start, 'OnlinePhase', 'off','EmptyAction','drop');
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多