转自:http://www.cnblogs.com/yixuan-xu/p/6272208.htmlK-
说在前面:
在网上找了很多关于k-means++的中文文章,基本上就两个版本。这篇文章算一个(这个版本也就只有一篇);另外一个版本应该来自同一人所写(其他几乎都是复制粘贴),但总觉得不怎么对劲。还好本文原博客贴出了一篇k-means作者的论文,以及笔者参考了维基百科。这个版本应该更让人信服一点。
一、概述
measn++算法同原始的K-means算法的区别就在于初始中心点的选择。
原始K-means算法在开始随机选取数据集中K个点作为聚类中心,这样做的缺点就是,如果初始点的位置选择不当(例如都在一个簇里面),那么其最终的聚类结果将是非常糟糕的。
K-means++则按照如下思路选择K个初始中心点:假设已经选取了n个初始聚类中心(0< n < K,同Kmeans一样,其K值都是已知的),则在选取第n+1个聚类中心时:距离当前**已有的**n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心。在选取第一个聚类中心(n=1)时同样通过随机的方法。当然这也非常符合我们直觉:聚类中心当然是相互离得越远越好
综述:k-means++与原始K-means的却别就在于初始点的处理上,确定好初始点之后,其余步骤都同Kmeans一样
二、算法步骤
Step 1:从数据集中随机选取一个样本点作为初始聚类中心 C1 ;
Step 2:首先计算每个样本与当前已有聚类中心之间的最短距离(即最近的聚类中心的距离),用 D(x) 表示;接着计算每个样本点被选为下一个聚类中心的概率 D(x)2∑ni=1D(xi)2 。最后,按照轮盘法选择出下一个聚类中心;
Step 3:重复第2步知道选择出K个聚类中心;
之后的步骤同原始K-means聚类算法相同;
2.1计算第二个中心点
下面结合一个简单的例子说明K-means++是如何选取初始聚类中心的。数据集中共有12个样本,分布以及对应序号如下图所示:
由上图可知,样本点一共有3个簇, 假设经过步骤一后6号点被选择为第一个初始聚类中心,那在进行步骤二时每个样本的D(x)和被选择为第二个聚类中心的概率如下表所示:
从表1我们可以看出,下一个聚类中心点落在1-4这四个点的概率区间为 [0,0.4738] (例如其分别落在点1,点2的概率为 [0,0.1053];[0.1053,0.2764] );落在5-8这四个点的概率区间为 [0.4738,0.5265] 落在9-12这四个点的概率区间为 [0.5265,1] 也就是说选到前4个点和后4个点的概率总和差不多接近1了,而这也是我们所希望看到的,因为5,6,7,8这个簇已经有了中心点。这也更体现了聚类中心当然是相互离得越远越好
此时,只要随机生成一个0-1之间的数(如matlab中的rand函数),就能确定好下一个聚类中心。假设下一个中心为第10个点,如下图,我们开始第三个中心点的计算。
2.2计算第三个中心点
此时我们同样需要计算所有点到其对应最近中心点的距离(也就是算出每个点到所有中心点的距离,然后选择最小的距离作为 D(xi) )。计算结果如下表所示:
同样我们可以看到,1-4这四个点的概率区间为 [0,0.7647] ,也就是说第三个中心为点1或2或3或4的概率有0.7647,而这也符合我们的预期(离当前已有聚类中心较远的点有更大的概率被选为下一个聚类中心)。
此时,三个初始中心点就已经选择好了。后面的步骤同原始K-means算法一样。