更新完15章 md内容

This commit is contained in:
jiangzhonglian
2017-06-20 21:21:28 +08:00
parent 7a6f67244f
commit cf6fac4af4
11 changed files with 206 additions and 69 deletions

View File

@@ -3,7 +3,7 @@
'''
Created on Mar 8, 2011
Update on 2017-05-18
@author: Peter Harrington/山上有课树
@author: Peter Harrington/山上有课树/片刻
《机器学习实战》更新地址https://github.com/apachecn/MachineLearning
'''
from numpy import linalg as la

View File

@@ -1,45 +1,58 @@
#!/usr/bin/python
# coding:utf8
'''
Created on 2017-04-07
@author: Peter/ApacheCN-xy
Update on 2017-06-20
@author: Peter/ApacheCN-xy/片刻
《机器学习实战》更新地址https://github.com/apachecn/MachineLearning
'''
from mrjob.job import MRJob
class MRmean(MRJob):
def __init__(self, *args, **kwargs): # 对数据初始化
def __init__(self, *args, **kwargs): # 对数据初始化
super(MRmean, self).__init__(*args, **kwargs)
self.inCount = 0
self.inSum = 0
self.inSqSum = 0
def map(self, key, val): # 需要 2 个参数,求数据的和与平方和
if False: yield
# 接受输入数据流
def map(self, key, val): # 需要 2 个参数,求数据的和与平方和
if False:
yield
inVal = float(val)
self.inCount += 1
self.inSum += inVal
self.inSqSum += inVal*inVal
def map_final(self): # 计算数据的平均值,平方的均值,并返回
# 所有输入到达后开始处理
def map_final(self): # 计算数据的平均值,平方的均值,并返回
mn = self.inSum/self.inCount
mnSq = self.inSqSum/self.inCount
yield (1, [self.inCount, mn, mnSq])
def reduce(self, key, packedValues):
cumVal=0.0; cumSumSq=0.0; cumN=0.0
for valArr in packedValues: # 从输入流中获取值
cumN, cumVal, cumSumSq = 0.0, 0.0, 0.0
for valArr in packedValues: # 从输入流中获取值
nj = float(valArr[0])
cumN += nj
cumVal += nj*float(valArr[1])
cumSumSq += nj*float(valArr[2])
mean = cumVal/cumN
var = (cumSumSq - 2*mean*cumVal + cumN*mean*mean)/cumN
yield (mean, var) # 发出平均值和方差
yield (mean, var) # 发出平均值和方差
def steps(self):
"""
step方法定义执行的步骤。
执行顺序不必完全遵循map-reduce模式。
例如:
1. map-reduce-reduce-reduce
2. map-reduce-map-reduce-map-reduce
在step方法里需要为mrjob指定mapper和reducer的名称。如果没有它将默认调用mapper和reducer方法。
在mapper 和 mapper_final中还可以共享状态mapper 或 mapper_final 不能 reducer之间共享状态。
"""
return ([self.mr(mapper=self.map, mapper_final=self.map_final, reducer=self.reduce,)])

View File

@@ -2,34 +2,39 @@
# coding:utf8
'''
Created on 2017-04-06
Update on 2017-06-20
Machine Learning in Action Chapter 18
Map Reduce Job for Hadoop Streaming
@author: Peter Harrington/ApacheCn-xy
'''
'''
这个mapper文件按行读取所有的输入并创建一组对应的浮点数然后得到数组的长度并创建NumPy矩阵。
再对所有的值进行平方,最后将均值和平方后的均值发送出去。这些值将用来计算全局的均值和方差。
Args
file 输入数据
Return
Map Reduce Job for Hadoop Streaming
@author: Peter/ApacheCN-xy/片刻
《机器学习实战》更新地址https://github.com/apachecn/MachineLearning
'''
import sys
from numpy import mat, mean, power
'''
这个mapper文件按行读取所有的输入并创建一组对应的浮点数然后得到数组的长度并创建NumPy矩阵。
再对所有的值进行平方,最后将均值和平方后的均值发送出去。这些值将用来计算全局的均值和方差。
Args
file 输入数据
Return
'''
def read_input(file):
for line in file:
yield line.rstrip() # 返回值中包含输入文件的每一行的数据的一个大的List
input = read_input(sys.stdin) # 创建一个输入的数据行的列表list
input = [float(line) for line in input] # 将得到的数据转化为 float 类型
numInputs = len(input) # 获取数据的个数,即输入文件的数据的行数
input = mat(input) # 将 List 转换为矩阵
sqInput = power(input,2) # 将矩阵的数据分别求 平方,即 2次方
yield line.rstrip() # 返回一个 yield 迭代器,每次获取下一个值,节约内存。
input = read_input(sys.stdin) # 创建一个输入的数据行的列表list
input = [float(line) for line in input] # 将得到的数据转化为 float 类型
numInputs = len(input) # 获取数据的个数,即输入文件的数据的行数
input = mat(input) # 将 List 转换为矩阵
sqInput = power(input, 2) # 将矩阵的数据分别求 平方,即 2次方
# 输出 数据的个数n个数据的均值n个数据平方之后的均值
print ("%d\t%f\t%f" % (numInputs, mean(input), mean(sqInput))) #计算均值
print >> sys.stderr, "report: still alive"
# 第一行是标准输出也就是reducer的输出
# 第二行识标准错误输出,即对主节点作出的响应报告,表明本节点工作正常。
# 【这不就是面试的装逼重点吗如何设计监听架构细节】注意一个好的习惯是想标准错误输出发送报告。如果某任务10分钟内没有报告输出则将被Hadoop中止。
print("%d\t%f\t%f" % (numInputs, mean(input), mean(sqInput))) # 计算均值
print >> sys.stderr, "map report: still alive"

View File

@@ -3,44 +3,44 @@
'''
Created on 2017-04-06
Update on 2017-06-20
Machine Learning in Action Chapter 18
Map Reduce Job for Hadoop Streaming
@author: Peter Harrington/ApacheCn-xy
Map Reduce Job for Hadoop Streaming
@author: Peter/ApacheCN-xy/片刻
《机器学习实战》更新地址https://github.com/apachecn/MachineLearning
'''
import sys
'''
mapper 接受原始的输入并产生中间值传递给 reducer。
很多的mapper是并行执行的所以需要将这些mapper的输出合并成一个值。
即:将中间的 key/value 对进行组合。
'''
import sys
from numpy import mat, mean, power
def read_input(file):
for line in file:
yield line.rstrip() # 返回值中包含输入文件的每一行的数据的一个大的List
input = read_input(sys.stdin) # 创建一个输入的数据行的列表list
# 将输入行分割成单独的项目并存储在列表的列表中
mapperOut = [line.split('\t') for line in input]
# 输入 数据的个数n个数据的均值n个数据平方之后的均值
print (mapperOut)
# 累计样本总和,总和 和 总和 sq
cumVal=0.0
cumSumSq=0.0
cumN=0.0
# 累计样本总和,总和 和 平分和的总和
cumN, cumVal, cumSumSq = 0.0, 0.0, 0.0
for instance in mapperOut:
nj = float(instance[0])
cumN += nj
cumVal += nj*float(instance[1])
cumSumSq += nj*float(instance[2])
#计算均值
mean = cumVal/cumN
meanSq = cumSumSq/cumN
#输出 数据总量,均值,平方的均值(方差)
print ("%d\t%f\t%f" % (cumN, mean, meanSq))
print >> sys.stderr, "report: still alive"
# 计算均值( varSum是计算方差的展开形式 )
mean_ = cumVal/cumN
varSum = (cumSumSq - 2*mean_*cumVal + cumN*mean_*mean_)/cumN
# 输出 数据总量,均值,平方的均值(方差)
print ("数据总量:%d\t均值:%f\t方差:%f" % (cumN, mean_, varSum))
print >> sys.stderr, "reduce report: still alive"