如何用MapReduce的思路实现K-means算法

对于有n个对象的数据集,如果要聚成k类,Kmeans的基本思路是:
1、首先从这n个对象中随机选择k个对象作为初始的k个簇的中心(就叫做“簇心”吧);

2、然后将其余的对象分到最近的簇心,如此k个簇就出来了;

3、之后对每个簇,求新的簇心(基本方法是将属于该簇的所有点放在一起求平均值);

4、重复2、3步(一轮2、3步,可以叫做一次迭代),直到所有的簇心基本不再变化,或者达到指定的重复次数;

5、和第2步相同。
从上面的步骤中,可以看出在每次迭代中,计算距离这一操作需要执行n*k次;很容易看出,对一个对象求最近簇心并不受对另外一个对象求最近簇心的影响,所以这一步是可以并行的。由于每次迭代要用到的簇心是上一次迭代的结果,所以些迭代是串行的关系。
实现思路:


1、实现可行性分析:
在进行K-Means聚类中,在处理每一个数据点时,只需要知道各个
cluster的中心信息(簇ID, 簇中点个数,簇中心点对象属性),不需
要知道关于其他数据点的任何信息。数据中所有点对象不互相影响,
因此可以进行Hadoop并行处理。
2、MapReduce并行化KMeans算法设计思路:
(1)将所有的点对象数据分布到不同的MapReduce节点上,每个节点只对自己的数据进行计算。
(2)每个Map节点能够读取上一次迭代生成的cluster中心点信息,并判断自己的各个数据点应该属于哪一个cluster。
(3)Reduce节点累加属于某个cluster的每个数据点,计算出新的cluster中心点,输出到指定序列号文件中,作为下一次迭代的输入。
Map用来找到每个点对象所属的簇ID,Reduce 将相同簇ID点对象数据合并生成新簇对象
3、代码实现流程思路:
(1)初始化:根据传入K值,在源数据中随机选择K个点对象作为初始的簇中心,生成簇对象(簇ID, 簇中点个数,簇中心点对象属性)存入输出文件中。
(2)迭代:遍历源数据点对象,将其中的每个点对象与上一次输出文件中的簇对象记录进行比较根据最短欧式距离分配到不同的簇中,并计算生成下次迭代用到的新簇对象,存入对应索引输出文件中,以便下次迭代使用。
(3)输出最终结果:遍历源数据点对象,根据最后一次迭代输出的簇对象来分配到不同的簇,然后输出分类结果。

你可能感兴趣的:(学习)