Mapreduce是一个分布式计算模型,用来解决海量数据的计算问题。

首先打个比方,我们要做菜,你切牛肉,我切土豆,这就是“Map”。我们人越多,切得就越快。

然后我们把切好的牛肉和土豆放到一起,这就是“Reduce”。

(1)  Map阶段

将一个大任务分解成小任务,并分发给每个节点,每个节点并行处理这些任务,处理速度很快。

实现:读取文件内容的时候对每一行解析成key-value的形式,

          再传进map()函数,得到的结果也是以key-value的形式输出。

(2)  Reduce阶段

对Map的结果汇总

实现:首先有一个shuffle的过程,对多个mapper任务的输出进行合并、排序,

        然后传进reduce()函数,进行汇总处理,最后输出被保存到指定的目录下。

 

MapReduce的思想就是并发,有时候可以更快得实现数据挖掘算法。

KNN:

Map():每个worker节点都分配部分训练集,map()函数用来计算样本距离

输入键值对当中,key是所有样本标号,value是样本的属性跟标签,

       输出key是测试样本的标号,value是某个训练样本的标签跟距离

Reduce():对同一个Key对应的标签跟距离,首先对距离排序,取出前K个标签,就可以预测了。

正常情况下reduce的机器一般小于map的机器,如果把map的输出全扔到reduce那边,那么reduce过程就会很久,

一个优化的方法就是在map的最后阶段,我们直接对每个key取前k个结果。

 

朴素贝叶斯:

Map():每个worker节点都分一些样本,map()的输入key是样本标号,value是样本记录,

           map()函数对每一个记录拆分标签,把类别作为key,map()的输出key是类别,value是记录。

Reduce():将每条记录转换成矩阵,对每一个类别相同的record进行相加,再归一化就可以得到概率了。

再根据概率连乘进行分类。


k-means:

map():输入key是样本标号,value是样本信息,map()计算样本点到各个中心的距离,求出它属于哪个中点的类,

           那么输出key是该样本所属的中心点,value是样本信息

reduce():对同一个key的点做一个累加,进行归总,再更新聚类中心。