大体思路
Ø 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值,看看质心是否变化,假设还在变化,那就继续迭代,否则就退出。
网友评论