K-Means如何运作?

时间:2014-02-07 14:28:15

标签: algorithm k-means

我对K-Means的运作方式感到迷茫和迷茫。到目前为止我所知道的是

  1. 绘制n分,说7分
  2. 随机选择k点,比如说3点作为质心
  3. centroids将是类的类型,因此我们有3个类
  4. 选择一个点来分类其类
  5. 所选3的最近班级将对选择的点进行分类
  6. 我已经实现了获取包含这些点的文本文件。选择文件后,将绘制点。现在我就到了那里。

    这是我想知道的:

    1.我想知道在绘制点之后我应该做的下一件事,因为我不确定上面提到的算法。

    2.我想知道迭代是如何工作的,迭代来获取每个点的最终类。我很困惑,因为我不知道如果从最近的一个班级获得班级,那么拾取点如何改变班级

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:12)

K-Means的输入是一组点(观察)和一个整数K.目标是将输入点划分为K个不同的集合(集群)。

第一步是通过选择K个初始聚类质心位置来初始化算法。这通常通过从输入集中随机选择K点来完成。利用这些初始K质心,算法通过重复以下两个主要步骤来继续:

1)群集分配 - 这里,将每个观察(例如,数据集中的每个点)分配给群集质心,使得WCSS目标函数最小化。这通常可以转化为将每个观测值分配给最近的群集质心(这对于许多距离度量而言恰好最小化WCSS),但是对于某些距离度量和空间,情况不一定如此。
2)更新质心 - 在将所有输入观测值分配给聚类质心后,重新计算每个质心。对于每个聚类,通过对分配给它的观察值进行平均来计算新的质心(例如,计算观察值的“均值”)。

重复这些步骤,直到算法“收敛”。有几种方法可以检测收敛。最典型的方法是运行,直到没有观察结果改变集群成员资格。作为附加提示,如果您为每次迭代计算WCSS(如下所述),您应该看到它减少(例如,算法运行时误差应该变小)。如果没有,你的实现可能有一个错误。

理解K-Means因陷入局部最小值而臭名昭着也很重要。这意味着最终结果可能不是最好的结果。为了解决这个问题,K-Means通常使用不同的起点(初始质心)运行多次,并选择具有最低误差的运行。

群内平方和(WCSS)用于衡量误差(在维基百科上解释:http://en.wikipedia.org/wiki/K-means_clustering)。 WCSS计算为

totalError = 0;
foreach(Point p in inputData)
{
    // compute p's error
    pError = someDistanceFunc(p, p_centroid)^2 
    totalError += pError;
}

基本上,对于每个点,您可以根据它与质心的接近程度来计算误差测量值。所有这些错误都会累加起来计算总误差。

互联网上有很多K-Means信息。为了更深入的描述,我推荐Andrew Ng的Coursera讲座: http://www.youtube.com/watch?v=Ao2vnhelKhI