常用MapReduce数据挖掘算法之均值、方差

数据库 算法
本文讲讲一些机器学习算法的map-reduce并行策略,尽管有些算法确实不适合map-reduce计算,但是掌握一些并行思想策略总归不是件坏事,大家如果对某个算法有更好的并行策略,也请多多指教,欢迎大家交流,OK,下面先从一个最基本的均值、方差的并行开始。

均值、方差的map-reduce

一堆数字的均值、方差公式,相信都很清楚,具体怎么设计map跟reduce函数呢,可以先从计算公式出发,假设有n个数字,分别是a1,a2....an,那么 均值m=(a1+a2+...an) / n,方差 s= [(a1-m)^2+(a2-m)^2+....+(an-m)^2] / n

把方差公式展开来S=[(a1^2+.....an^2)+m^m*n-2*m*(a1+a2+....an) ] / n,根据这个我们可以把map端的输入设定为(key,a1),输出设定为(1,(n1,sum1,var1)),n1表示每个worker所计算的数字的个数,sum1是这些数字的和(例如a1+a2+a3...),var1是这些数字的平方和(例如a1^2+a2^2+...)

       reduce端接收到这些信息后紧接着把所有输入的n1,n2....相加得到n,把sum1,sum2...相加得到sum,那么均值m=sum/n,把var1,var2...相加得到var,那么***的方差S=(var+m^2*n-2*m*sum)/n,reduce输出(1,(m,S))。

算法代码是基于mrjob的实现(https://pythonhosted.org/mrjob/,机器学习实战第十五章)

  1. from mrjob.job import MRJob 
  2. class MRmean(MRJob): 
  3.     def __init__(self, *args, **kwargs): 
  4.         super(MRmean, self).__init__(*args, **kwargs) 
  5.         self.inCount = 0 
  6.         self.inSum = 0 
  7.         self.inSqSum = 0 
  8.     def map(self, key, val): #needs exactly 2 arguments 
  9.         if False: yield 
  10.         inVal = float(val) 
  11.         self.inCount += 1 
  12.         self.inSum += inVal #每个元素之和 
  13.         self.inSqSum += inVal*inVal #求每个元素的平方 
  14.     def map_final(self): 
  15.         mn = self.inSum/self.inCount 
  16.         mnSq =self.inSqSum/self.inCount 
  17.         yield (1, [self.inCount, mn, mnSq]) #map的输出,不过这里的mn=sum1/mn,mnsq=var1/mn 
  18.     def reduce(self, key, packedValues): 
  19.         cumVal=0.0; cumSumSq=0.0; cumN=0.0 
  20.         for valArr in packedValues: #get values from streamed inputs 解析map端的输出 
  21.             nj = float(valArr[0]) 
  22.             cumN += nj 
  23.             cumVal += nj*float(valArr[1]) 
  24.             cumSumSq += nj*float(valArr[2]) 
  25.        mean = cumVal/cumN 
  26.         var = (cumSumSq - 2*mean*cumVal + cumN*mean*mean)/cumN 
  27.         yield (mean, var) #emit mean and var reduce的输出 
  28.    def steps(self): 
  29.         return ([self.mr(mapper=self.map, mapper_final=self.map_final,\ 
  30.                           reducer=self.reduce,)]) 
  31. if __name__ == '__main__': 
  32.     MRmean.run() 
原文链接:http://www.cnblogs.com/kobedeshow/p/3600328.html
责任编辑:彭凡 来源: YYGamer
相关推荐

2014-05-13 09:56:24

数据挖掘

2020-06-03 15:35:10

数据挖掘算法大数据

2018-10-27 15:47:35

CART算法决策树

2018-09-13 12:51:58

数据挖掘算法朴素贝叶斯

2011-08-11 16:16:26

SQL Server数据挖掘

2014-03-18 10:16:58

SVM

2012-08-09 09:57:54

K-means

2011-07-25 16:05:27

SQL SERVER数Web路径流挖掘

2018-05-03 09:36:53

算法数据挖掘C4.5

2015-03-24 15:08:21

mapreducehadoop

2017-05-26 08:53:27

数据挖掘算法

2014-11-11 15:46:54

MapReduce算法

2018-04-25 08:10:50

算法k-means代码

2015-08-18 09:42:25

2014-07-16 16:54:38

2016-01-29 11:00:55

数据挖掘算法大数据

2009-04-13 10:15:24

SQLServer 2005数据挖掘

2020-03-12 09:06:05

数据挖掘聚类分析学习

2013-02-25 09:46:35

数据挖掘算法ICDM

2020-07-11 09:42:59

python数据挖掘数据分析
点赞
收藏

51CTO技术栈公众号