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不是简单把算术平均当作中心的, 就不能用这个优化手段.