要解决的问题
kmeans算法存在的一个问题是初始中心的选取是随机的,造成聚类的结果也是随机的,一般的做法是进行多次重复整个聚类过程,然后选取聚类效果好的。Kmeans++算法可以很好的解决初始点的选取问题,本文简单进行了总结和实现,代码方面还有很多不完善的地方,仅供参考,欢迎拍砖。
算法流程
a). 首先从数据集中随机选取一个点作为中心点,并加入到中心点集合centers中
b). 对于数据集中的每个点i,都和集合centers中的点进行计算,得到最近距离d[i],计算完之后得到sum(d[i])
c). 取一个随机值random,使random落在sum(d[i])内,然后random -= d[i] 直到random < 0的时候,这个i即为下一个中心点,将这个点加入到centers中
d). 重复b和c过程直到完成所有中心点的选取
算法分析
初始点的选取类似于加权的蓄水池采样,权重是和中心点的最近距离相关的,算法的复杂度为O(k*k*m*n)其中k为聚类中心的个数,m为数据集的样本数,n为数据样本的空间维度
算法实现
蓄水池采样算法
关于这个算法可以百度下,比较经典的面试题目,这里想提的是其在ClouderaML的两个应用,比如分布式蓄水池采样和加权分布式蓄水池采样,有些算法看着很无趣,但是应用到具体的实践场景还是能让人眼前一亮,原文参考Algorithms Every Data Scientist Should Know: Reservoir Sampling
Kmeans的改进-kmeans++算法的聚类中心初始点选取和蓄水池采样算法
原文:http://blog.csdn.net/hotallen/article/details/19247387