基于Hadoop的K-means聚类算法的实现

来源:互联网 发布:邮箱的域名是什么 编辑:程序博客网 时间:2024/06/06 05:55

                 K-means算法的MapReduce并行化实现

1.K-means聚类算法的基本思路

 假设把样本集分为K类,算法描述如下:

(1).首先在数据集合中随机选取k个点作为k个星团的质心

(2)然后计算每个点到k个质心的距离,将其归类为距离最近的那个质心所在的类,这样每个点都有了所属的类别

(3)对每个聚类中所有的点的坐标取平均值,将其设为新的质心

(4)重复迭代第二步和第三步,直到质心不变或者变化很小

下图展示了对n个样本点进行K-means聚类的效果,这里k取2。

     clip_image015

2.K-means算法的MapReduce并行化实现

  用MapReduce处理的数据集应该具备这样的特点:它可以被分解成许多小的数据集,且每一个小的数据集可以完全并行的进行处理。在K-means算法中,每个元素到质心距离的计算都是独立被操作的,元素在运算过程中相互没有联系,因此,可以使用MapReduce模型来实现并行化。基本思路是:每一次迭代启动一个MapReduce过程,具体过程如下图。根据MapReduce计算的需求,将数据按行分片,片间数据无相关性。



Map函数的设计:

Map函数的任务是从HDFS的文件中逐行读取数据,针对每一条记录,计算它到各个质心的距离,并将该记录做类别标记。

Map函数的输入是原始文件和聚类质心,输入数据记录的<key,value>为<行号,记录>;输出中间结果<key,value>为<记录所属类别,记录>。

Map函数具体描述如下:

public void map(Object key, Text value, Context content){

计算记录到每个质心的距离;

比较上述距离;

将此记录归结到距离最近的哪个质心所属的类;

将<记录所属类别,记录>写入中间文件;

}

Reduce函数的设计:

Reduce函数的任务是根据Map函数的输出,更新聚类中心,供下一轮Map函数使用。同时,计算标准测度函数的值,以供主函数判断迭代是否结束。

在执行Reduce函数之前,MapReduce会先对Map函数输出的中间结果进行合并(combine),将中间结果中有相同key值的多组<key,value>对合并成一堆。Reduce函数的输入<key,value>为<记录所属类别,{记录集合}>。输出结果<key,value>为<类别号,均值向量+该类的平方误差和>。

Reduce函数的具体实现如下:

public void reduce (Text key, Iterable<Text> values, Context content){

for(对于key相同的所有记录){

求每个属性的均值;

计算记录到其质心的距离;

对上述距离求和(e);

}

将<记录所属类别,均值向量+每个类的平方误差和e>写入结果文件;

}

在主函数调用上述MapReduce过程,每次迭代申请一个新的job,直到两次得到的平方误差和的差值小于给定的阈值,迭代结束。Map函数最后一次的中间结果就是分类的最后结果。



0 0
原创粉丝点击