美文网首页秋招-算法
MapReduce实现Kmeans思路

MapReduce实现Kmeans思路

作者: 0过把火0 | 来源:发表于2018-10-12 14:58 被阅读3次

    大体思路

    Ø Map 函数:
        ○ 计算每一个质心与样本之间的距离,得到与样本距离最短的质心,以这个质心作为key,样本作为value,输出。
    Ø Reduce 函数:
        ○ 输入的key是质心,value是其它的样本,这时又一次计算聚类中心,将聚类中心put到一个所有变量t中。
    Ø main 函数:
        ○ 在main里比較前一次的质心和本次的质心是否发生变化,假设变化,则继续迭代,否则退出。
    

    注意点

    实现过程的注意点:
    1、hadoop是不存在自己定义的全局变量的。所以上面定义一个全局变量存放质心的想法是实现不了的。所以一个替代的思路是将质心存放在文件里。
    2、存放质心的文件在什么地方读取,假设在map中读取。那么能够肯定我们是不能用一个mapreduce实现一次迭代。所以我们选择在main函数里读取质心,然后将质心set到configuration中。configuration在map和reduce都是可读。
    3、怎样比較质心是否发生变化,是在main里比較么,读取本次质心和上一次质心的文件然后进行比較。这样的方法是能够实现的,可是显得不够高富帅,这个时候我们用到了自己定义的counter,counter是全局变量,在map和reduce中可读可写,在上面的思路中,我们看到reduce是有上次迭代的质心和刚刚计算出来的质心的。所以直接在reduce中进行比較就全然能够。假设没发生变化,counter加1。仅仅要在main里比較获取counter的值即可了。

    详细实现思路

    Ø main函数读取质心文件
    Ø 将质心的字符串通过set放入configuration中
    Ø 在mapper类重写setup方法,获取到configuration的质心内容,解析为二维数组的形式,代表质心
    Ø mapper类中的map方法读取样本文件,跟全部质心进行距离计算,得出每一个样本跟哪个质心比较近,然后输出<质心, 样本>
    Ø reducer类中再一次计算质心,假设再一次计算出来的质心跟读进来的质心一样,说明收敛,那么counter+1
    Ø main中获取counter值,看看质心是否变化,假设还在变化,那就继续迭代,否则就退出。
    

    相关文章

      网友评论

        本文标题:MapReduce实现Kmeans思路

        本文链接:https://www.haomeiwen.com/subject/yqkgaftx.html