传统k-means的算法原理:
输入:k
输出:k个簇
过程:首先人为指定k个对象作为簇中心;然后计算每个对象到所有簇中心的距离,每个对象中,距离最小的簇中心为该对象的簇中心,并把该对象划分到该簇中;
对分好的所有簇进行重新计算,得到新的簇中心 ,然后重复上述过程;直到所有簇中心不变。
分析:上述算法中,有些必须串行化实现,有些可以并行化。串行化的部分必须通过轮与轮之间的迭代实现,并行化的部分可以通过MR的每一轮实现。迭代与迭代之间属于串行的;
每一轮迭代中,都会计算所有对象与中心点之间的距离,而这些是不相关的,所以计算每个对象和中心之间的距离可以并行化实现。
基于MR的k-means算法的并行化设计:
map任务:对每个对象做相同的计算,即,计算该对象与所有中心的距离,选择距离最小者,并把该中心作为该对象所在簇的中心。
输入:所有的簇中心,key-偏移;value-对象值
输出:key-该对象的簇中心,value-该对象的其他一些信息
combine的作用:计算有相同簇中心的所有对象的距离之和,以及这些对象的数目
输入:上一轮map的输出<key,value>做过shuffle处理后的值<key,V>,V是相同簇中心的对象列表。
输出:<key,value>,key还是簇中心的index,value是对象距离之和以及对象数目的组合。
过程:初始化数组,且存放所有对象;初始化int型变量为0,用来存放对象数目。通过循环,求和且数目。
reduce作用:计算新的簇中心,并且更新
输入:<key,value>,key是簇中心index,value是上述combine输出的那些来自相同主机的value组成的列表
输出:<key,value>,key是所哟簇中心的index,value是更新后的簇中心得距离。
多次迭代,设置收敛条件即可。