我对K-Means的工作方式感到迷茫和困惑.到目前为止我所知道的是
我已经实现了获取包含这些点的文本文件.选择文件后,将绘制点.现在我停在那里.
这是我想知道的:
1.我想知道在绘制点之后我应该做的下一件事,因为我不确定我上面说的算法.
2.我想知道迭代是如何工作的,迭代得到每个点的最终类.我很困惑,因为我不知道如果从类最近的点获得类,拾取点如何更改类
任何帮助将非常感激.
mat*_*ich 12
K-Means的输入是一组点(观察)和一个整数K.目标是将输入点划分为K个不同的集合(集群).
第一步是通过选择K个初始聚类质心位置来初始化算法.这通常通过从输入集中随机选择K点来完成.使用这些初始K质心,算法通过重复以下两个主要步骤来继续:
1)群集分配 - 这里,每个观察(例如,数据集中的每个点)被分配给群集质心,使得WCSS目标函数被最小化.这通常可以转换为将每个观察分配给最近的聚类质心(这对于许多距离度量而言恰好最小化WCSS),但是对于一些距离度量和空间,这不是必须的.
2)更新质心 - 在将所有输入观测值分配给聚类质心后,重新计算每个质心.对于每个聚类,通过对分配给它的观察值求平均来计算新的质心(例如,计算观察值的"平均值").
重复这些步骤直到算法"收敛".有几种方法可以检测收敛.最典型的方法是运行,直到没有观察结果改变集群成员资格.作为附加提示,如果您为每次迭代计算WCSS(如下所述),您应该看到它减少(例如,随着算法运行,误差应该变小).如果没有,你的实现可能有一个bug.
同样重要的是要理解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;
}
Run Code Online (Sandbox Code Playgroud)
基本上,对于每个点,您可以根据它与质心的接近程度来计算误差测量值.将所有这些错误相加以计算总错误.
互联网上有很多K-Means信息.如需更深入的描述,我推荐Andrew Ng的Coursera讲座:http://www.youtube.com/watch?v = Ao2vnhelKhI