优化K-means算法

时间:2014-11-20 16:07:18

标签: algorithm machine-learning k-means

我试图关注一篇名为An Optimized Version of K-Means Algorithm的论文。我对K-Means算法works的看法有所了解。也就是说,将元组/点分组为集群并更新质心。

我试图实施上述论文中提到的方法。他们提出的算法是这样的:

enter image description here

所以我怀疑是第二步。我不明白它在那里做了什么!在论文中它说,我们根据e的值将数据分组到更宽的区间,以便稍后我们可以避免遍历整个数据集。那么,实际上我们如何将它存储在I(间隔)中?我们应该定义一个多维数组吗?这对我来说没有意义(可能是愚蠢到不能得到这个想法)。

接下来我怀疑的是第5步。在那里,Cw被认为是那一点最接近的质心。但是我们如何解决这个问题呢?首先,我们将随机分配一个点作为质心。那么,在计算Cw之前,我们是否应该遍历这些点并找出e(最近的质心)?

接下来的疑问是在第6步,我想在得到关于Step2之前的问题的想法之后我能够理解。

最后的疑问是关于Step7。 CjCj'是什么意思?前一个质心位置与更新的质心位置之间的距离?

一整天以来,我一直在为这个问题大发雷霆。任何线索都将受到高度赞赏。谢谢

3 个答案:

答案 0 :(得分:1)

第二步:间隔在距离度量上,而不在数据坐标上。

第五步:这基本上是距离第二个最近的群集的距离。

如果您仍然不理解其余部分,请告诉我。

答案 1 :(得分:1)

该算法围绕这样的想法,即靠近一个集群中心并远离所有其他集群中心的点将坚持该集群中心。因此,在后续迭代中,不必将这些点与所有聚类中心进行比较。

想象一个点P与其指定的簇具有距离3(即,这是最近的距离),并且所有其他簇距离至少为8或更远。现在,计算新的集群中心。假设移动的群集中心最多为2(即算法中D的值,第7行)。

您现在可以确定您的点仍属于同一群集。如果您考虑最坏的情况,这很容易理解:指定的群集可能已经远离该点,因此最坏情况下可能会有3 + 2的新距离。最近的其他星团可能已朝着该点移动,因此它的距离现在可以是8-2。因此,您无需更新该点。

这是一张图片:

A sample

您的具体问题:

步骤2:创建稍后放入点的间隔。在第5步中,您将创建e个值。如果e是5,你将该点放入区间[4,6](如果你有这个间隔)。

步骤5:计算点到所有聚类的距离。最近的群集是Cw。如果下一个最近的群集是C3而不是e = C3 - Cw。我打电话给e安全边际。它为您提供了在分配可能切换之前群集可以移动的最大距离。

步骤6:用步骤2解释。

第7步:CjCj'Cj更新后移动的距离。

第7步& 8:这些是作为for循环的一部分完成的。 (在步骤9中,他们说“回到4”)。

步骤9:使用可能已更改群集的所有点继续循环。

更一般

此算法假设您知道k-means。我相信这是一个非常公平的假设。何时终止以及如何初始化算法不是很明确。这两个事实我都会考虑常识。

  • 通过为每个群集分配一个随机点来初始化群集中心。存在其他初始化例程。该算法不关心算法的这一部分。
  • 当没有标签小于0的间隔时终止算法。这相当于k-means中的正常终止标准:当没有为不同的集群分配点时停止。

答案 2 :(得分:0)

如果你坚持这个算法,可能就不足为奇了,但K-means中最先进的技术是Ravi Kannan描述的算法

https://www.youtube.com/watch?v=n3LQqUQb870

只是想说这是为了防止其他人试图实现k-means聚类并进入这个页面。 K-means的难点在于初始化。 您正在讨论的论文描述了运行时优化,但此优化并未改善群集本身。该算法也适用 在2D。

最先进的技术是首先运行SVD并在昏暗k的主子空间中进行聚类。 SVD还提供了一个很好的初始化策略。

k-means还有其他一些技巧,比如对矢量进行阈值处理等等。 Ravi Kannan在youtube上的讲座应该给你一个提示。

另一种常用的简单技巧是所谓的最远的第一次遍历。