Hadoop map-reduce 实现K-means聚类(combiner的使用)

K-means聚类简单回顾一下, 就是一个不停迭代的过程, 先随机若干个中心, 然后找出距离这几个中心最近的点, 然后把这些最近点的中心求出来作为新的中心.

使用map reducer来说

mapper的作用就是遍历所有点, 把这个点以及距离它最近的中心找到, 如果我们把点定义为D, 把中心定义为C, 那mapper的输出就是:

D1,  C2
D2,  C3
...

这里我们假设D1和C2最近, D2和C3最近

reducer自然是为了计算新的中心, 为了方便partition, mapper输出的时候, 应该以C为key, D为value

这样在这一轮迭代中被聚类到 同一个C 的点就会分配给同一个reducer来求新的中心点.


如果点太多的话, reducer的压力会很大, 有没有办法给reducer减压呢. 其实如果求中心点的算法是算术平均的话, 那就很好办了

(1+2+3+4+5)/5 = ((1+2)+(3+4)+5)/(2+2+1) = (3+7+5)/(2+2+1)

利用combiner, 先算出每个mapper的结果中, 每个中心最近的点的和 以及 其数量, 然后只要告诉reducer这两个值, reducer照样能算出算术平均值, 即中心值.


所以对于算术平均作为中心的K-Means 来说, combiner可以其到很好的优化作用, 但其他K-Means不是简单把算术平均当作中心的, 就不能用这个优化手段.

相关文章
相关标签/搜索