mirror of
https://github.com/apachecn/ailearning.git
synced 2026-05-12 03:27:11 +08:00
更新完15章 md内容
This commit is contained in:
19
bin/15_test.sh
Normal file
19
bin/15_test.sh
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# # 测试 Mapper
|
||||||
|
# # Linux
|
||||||
|
# cat input/15.BigData_MapReduce/inputFile.txt | python src/python/15.BigData_MapReduce/mrMeanMapper.py
|
||||||
|
# # # Window
|
||||||
|
# # python src/python/15.BigData_MapReduce/mrMeanMapper.py < input/15.BigData_MapReduce/inputFile.txt
|
||||||
|
|
||||||
|
# # 测试 Reducer
|
||||||
|
# # Linux
|
||||||
|
# cat input/15.BigData_MapReduce/inputFile.txt | python src/python/15.BigData_MapReduce/mrMeanMapper.py | python src/python/15.BigData_MapReduce/mrMeanReducer.py
|
||||||
|
# # # Window
|
||||||
|
# # python src/python/15.BigData_MapReduce/mrMeanMapper.py < input/15.BigData_MapReduce/inputFile.txt | python src/python/15.BigData_MapReduce/mrMeanReducer.py
|
||||||
|
|
||||||
|
# 测试 mrjob的案例
|
||||||
|
# 先测试一下mapper方法
|
||||||
|
# python src/python/15.BigData_MapReduce/mrMean.py --mapper < input/15.BigData_MapReduce/inputFile.txt
|
||||||
|
# 运行整个程序,移除 --mapper 就行
|
||||||
|
python src/python/15.BigData_MapReduce/mrMean.py < input/15.BigData_MapReduce/inputFile.txt
|
||||||
@@ -111,5 +111,4 @@ http://baike.baidu.com/link?url=76P-uA4EBrC3G-I__P1tqeO7eoDS709Kp4wYuHxc7GNkz_xn
|
|||||||
|
|
||||||
* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian) [1988](http://www.apache.wiki/display/~lihuisong)**
|
* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian) [1988](http://www.apache.wiki/display/~lihuisong)**
|
||||||
* [GitHub地址](https://github.com/apachecn/MachineLearning): <https://github.com/apachecn/MachineLearning>
|
* [GitHub地址](https://github.com/apachecn/MachineLearning): <https://github.com/apachecn/MachineLearning>
|
||||||
* [原文链接](https://github.com/apachecn/MachineLearning/blob/master/docs/1.%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80.md): <https://github.com/apachecn/MachineLearning/blob/master/docs/1.%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80.md>
|
* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apache.wiki)**
|
||||||
* **版权声明: 内容由[ApacheCN(apache中文网)](http://www.apache.wiki)更新维护,欢迎转载学习-记得标注信息来源,谢谢**
|
|
||||||
|
|||||||
@@ -90,3 +90,9 @@
|
|||||||
如果使用在线PCA分析的方法,你可以参考一篇优秀的论文 "Incremental Eigenanalysis for Classification"。
|
如果使用在线PCA分析的方法,你可以参考一篇优秀的论文 "Incremental Eigenanalysis for Classification"。
|
||||||
下一章要讨论的奇异值分解方法也可以用于特征值分析。
|
下一章要讨论的奇异值分解方法也可以用于特征值分析。
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian)**
|
||||||
|
* [GitHub地址](https://github.com/apachecn/MachineLearning): <https://github.com/apachecn/MachineLearning>
|
||||||
|
* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apache.wiki)**
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
# 第14章 利用SVD简化数据
|
# 第14章 利用SVD简化数据
|
||||||
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script>
|
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
```
|
```
|
||||||
奇异值分解(SVD, Singular Value Decomposition):
|
奇异值分解(SVD, Singular Value Decomposition):
|
||||||
提取信息的一种方法,可以把SVD看成是从噪声数据中抽取相关特征。从生物信息学到金融学,SVD是提出信息的强大工具。
|
提取信息的一种方法,可以把SVD看成是从噪声数据中抽取相关特征。从生物信息学到金融学,SVD是提出信息的强大工具。
|
||||||
@@ -115,3 +117,9 @@
|
|||||||
* 1)在大型系统中,SVD分解(可以在程序调入时运行一次)每天运行一次或者其频率更低,并且还要离线运行。
|
* 1)在大型系统中,SVD分解(可以在程序调入时运行一次)每天运行一次或者其频率更低,并且还要离线运行。
|
||||||
* 2)在实际中,另一个普遍的做法就是离线计算并保存相似度得分。(物品相似度可能被用户重复的调用)
|
* 2)在实际中,另一个普遍的做法就是离线计算并保存相似度得分。(物品相似度可能被用户重复的调用)
|
||||||
* 3)冷启动问题,解决方案就是将推荐看成是搜索问题,通过各种标签/属性特征进行`基于内容的推荐`。
|
* 3)冷启动问题,解决方案就是将推荐看成是搜索问题,通过各种标签/属性特征进行`基于内容的推荐`。
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian) [1988](http://www.apache.wiki/display/~lihuisong)**
|
||||||
|
* [GitHub地址](https://github.com/apachecn/MachineLearning): <https://github.com/apachecn/MachineLearning>
|
||||||
|
* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apache.wiki)**
|
||||||
|
|||||||
@@ -1,22 +1,21 @@
|
|||||||
# 大数据与MapReduce
|
# 大数据与MapReduce
|
||||||
|
|
||||||
> 本章内容
|

|
||||||
|
|
||||||
* MapReduce
|
`大数据: 收集到的数据已经远远超出了我们的处理能力。`
|
||||||
* Python中Hadoop流的使用
|
|
||||||
* 使用mrjob库将MapReduce自动化
|
|
||||||
* 利用Pegasos算法并行训练支持向量机
|
|
||||||
|
|
||||||
## MapReduce:分布式计算的框架
|
## MapReduce
|
||||||
|
|
||||||
```
|
```
|
||||||
优点:可在短时间内完成大量工作。
|
Hadoop 是 MapRedece框架的一个免费开源实现。
|
||||||
缺点:算法必须经过重写,需要对系统工程有一定的理解。
|
MapReduce: 分布式的计算框架,可以将单个计算作业分配给多台计算机执行。
|
||||||
适用数据类型:数值型和标称型数据。
|
优点: 使程序以并行的方式执行,可在短时间内完成大量工作。
|
||||||
|
缺点: 算法必须经过重写,需要对系统工程有一定的理解。
|
||||||
|
适用数据类型: 数值型和标称型数据。
|
||||||
```
|
```
|
||||||
|
|
||||||
* MapReduce集群的示意图
|
* MapReduce框架的示意图
|
||||||

|
* 
|
||||||
|
|
||||||
> 关于MapRduce的学习要点
|
> 关于MapRduce的学习要点
|
||||||
|
|
||||||
@@ -27,16 +26,104 @@
|
|||||||
* 数据被重复存放在不同的机器上,以防止某个机器实效
|
* 数据被重复存放在不同的机器上,以防止某个机器实效
|
||||||
* mapper和reducer传输的数据形式为key/value对
|
* mapper和reducer传输的数据形式为key/value对
|
||||||
|
|
||||||
## Hadoop流
|
## Python中Hadoop流的使用
|
||||||
|
|
||||||
## 在Amazon网络服务商运行Hadoop程序
|
> 理论简介
|
||||||
|
|
||||||
|
例如: Hadoop流可以像Linux命令一样执行
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
cat inputFile.txt | python mapper.py | sort | python reducer.py > outputFile.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
类似的Hadoop流就可以在多台机器上分布式执行,用户可以通过Linux命令来测试Python语言编写的MapReduce脚本。
|
||||||
|
|
||||||
|
> 实战脚本
|
||||||
|
|
||||||
|
```
|
||||||
|
# 测试 Mapper
|
||||||
|
# Linux
|
||||||
|
cat input/15.BigData_MapReduce/inputFile.txt | python src/python/15.BigData_MapReduce/mrMeanMapper.py
|
||||||
|
# # Window
|
||||||
|
# python src/python/15.BigData_MapReduce/mrMeanMapper.py < input/15.BigData_MapReduce/inputFile.txt
|
||||||
|
|
||||||
|
# 测试 Reducer
|
||||||
|
# Linux
|
||||||
|
cat input/15.BigData_MapReduce/inputFile.txt | python src/python/15.BigData_MapReduce/mrMeanMapper.py | python src/python/15.BigData_MapReduce/mrMeanReducer.py
|
||||||
|
# # Window
|
||||||
|
# python src/python/15.BigData_MapReduce/mrMeanMapper.py < input/15.BigData_MapReduce/inputFile.txt | python src/python/15.BigData_MapReduce/mrMeanReducer.py
|
||||||
|
```
|
||||||
|
|
||||||
## MapReduce上的机器学习
|
## MapReduce上的机器学习
|
||||||
|
|
||||||
## 在Python中使用mrjob来自动化MapReduce
|
> Mahout in Action
|
||||||
|
|
||||||
## 示例:分布式SVM的Pegasos算法
|
1. 简单贝叶斯:
|
||||||
|
2. k-近邻算法:
|
||||||
|
3. 支持向量机(SVM):使用随机梯度下降算法求解,如Pegasos算法。
|
||||||
|
4. 奇异值分解:Lanczos算法是一个有效的求解近似特征值的算法。
|
||||||
|
5. k-均值聚类:canopy算法初始化k个簇,然后再运行K-均值求解结果。
|
||||||
|
|
||||||
## 你真的需要MapReduce吗?
|
## 使用mrjob库将MapReduce自动化
|
||||||
|
|
||||||
## 本章小节
|
> 理论简介
|
||||||
|
|
||||||
|
* MapReduce作业流自动化的框架:Cascading 和 Oozie.
|
||||||
|
* mrjob是一个不错的学习工具,与2010年底实现了开源,来之于Yelp(一个餐厅点评网站).
|
||||||
|
|
||||||
|
```Shell
|
||||||
|
python mrMean.py < inputFile.txt > myOut.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
> 实战脚本
|
||||||
|
|
||||||
|
```
|
||||||
|
# 测试 mrjob的案例
|
||||||
|
# 先测试一下mapper方法
|
||||||
|
# python src/python/15.BigData_MapReduce/mrMean.py --mapper < input/15.BigData_MapReduce/inputFile.txt
|
||||||
|
# 运行整个程序,移除 --mapper 就行
|
||||||
|
python src/python/15.BigData_MapReduce/mrMean.py < input/15.BigData_MapReduce/inputFile.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 利用Pegasos算法并行训练支持向量机
|
||||||
|
|
||||||
|
> 在MapReduce框架上使用SVM的一般方法
|
||||||
|
|
||||||
|
```
|
||||||
|
收集数据:数据按文本格式存放。
|
||||||
|
准备数据:输入数据已经是可用的格式,所以不需任何准备工作。如果你需要解析一个大规模的数据集,建议使用map作业来完成,从而达到并行处理的目的。
|
||||||
|
分析数据:无。
|
||||||
|
训练算法:与普通的SVM一样,在分类器训练上仍需花费大量的时间。
|
||||||
|
测试算法:在二维空间上可视化之后,观察超平面,判断算法是否有效。
|
||||||
|
使用算法:本例不会展示一个完整的应用,但会展示如何在大数据集上训练SVM。该算法其中一个应用场景就是本文分类,通常在文本分类里可能有大量的文档和成千上万的特征。
|
||||||
|
```
|
||||||
|
|
||||||
|
> Pegasos 算法
|
||||||
|
|
||||||
|
Pegasos是指原始估计梯度求解器(Peimal Estimated sub-GrAdient Solver)。
|
||||||
|
Pegasos算法工作流程是:
|
||||||
|
1. 从训练集中随机挑选一些样本点添加到带处理列表中
|
||||||
|
2. 按序判断每个样本点是否被正确分类
|
||||||
|
* 如果是则忽略
|
||||||
|
* 如果不是则将其加入到待更新集合。
|
||||||
|
3. 批处理完毕后,权重向量按照这些错分的样本进行更新。
|
||||||
|
|
||||||
|
上述算法伪代码如下:
|
||||||
|
|
||||||
|
```
|
||||||
|
将w初始化为0
|
||||||
|
对每次批处理
|
||||||
|
随机选择k个样本点(向量)
|
||||||
|
对每个向量
|
||||||
|
如果该向量被错分:
|
||||||
|
更新权重向量w
|
||||||
|
累加对w的更新
|
||||||
|
```
|
||||||
|
|
||||||
|
我们继续看Python版本的代码实现。
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian) [小瑶](http://www.apache.wiki/users/viewmyprofile.action)**
|
||||||
|
* [GitHub地址](https://github.com/apachecn/MachineLearning): <https://github.com/apachecn/MachineLearning>
|
||||||
|
* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apache.wiki)**
|
||||||
|
|||||||
BIN
images/14.SVD/svd_headPage.jpg
Normal file
BIN
images/14.SVD/svd_headPage.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 154 KiB |
BIN
images/15.BigData_MapReduce/mr_headPage.jpg
Normal file
BIN
images/15.BigData_MapReduce/mr_headPage.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 154 KiB |
@@ -3,7 +3,7 @@
|
|||||||
'''
|
'''
|
||||||
Created on Mar 8, 2011
|
Created on Mar 8, 2011
|
||||||
Update on 2017-05-18
|
Update on 2017-05-18
|
||||||
@author: Peter Harrington/山上有课树
|
@author: Peter Harrington/山上有课树/片刻
|
||||||
《机器学习实战》更新地址:https://github.com/apachecn/MachineLearning
|
《机器学习实战》更新地址:https://github.com/apachecn/MachineLearning
|
||||||
'''
|
'''
|
||||||
from numpy import linalg as la
|
from numpy import linalg as la
|
||||||
|
|||||||
@@ -1,45 +1,58 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# coding:utf8
|
# coding:utf8
|
||||||
|
|
||||||
'''
|
'''
|
||||||
Created on 2017-04-07
|
Created on 2017-04-07
|
||||||
|
Update on 2017-06-20
|
||||||
@author: Peter/ApacheCN-xy
|
@author: Peter/ApacheCN-xy/片刻
|
||||||
|
《机器学习实战》更新地址:https://github.com/apachecn/MachineLearning
|
||||||
'''
|
'''
|
||||||
from mrjob.job import MRJob
|
from mrjob.job import MRJob
|
||||||
|
|
||||||
|
|
||||||
class MRmean(MRJob):
|
class MRmean(MRJob):
|
||||||
def __init__(self, *args, **kwargs): # 对数据初始化
|
def __init__(self, *args, **kwargs): # 对数据初始化
|
||||||
super(MRmean, self).__init__(*args, **kwargs)
|
super(MRmean, self).__init__(*args, **kwargs)
|
||||||
self.inCount = 0
|
self.inCount = 0
|
||||||
self.inSum = 0
|
self.inSum = 0
|
||||||
self.inSqSum = 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)
|
inVal = float(val)
|
||||||
self.inCount += 1
|
self.inCount += 1
|
||||||
self.inSum += inVal
|
self.inSum += inVal
|
||||||
self.inSqSum += inVal*inVal
|
self.inSqSum += inVal*inVal
|
||||||
|
|
||||||
def map_final(self): # 计算数据的平均值,平方的均值,并返回
|
# 所有输入到达后开始处理
|
||||||
|
def map_final(self): # 计算数据的平均值,平方的均值,并返回
|
||||||
mn = self.inSum/self.inCount
|
mn = self.inSum/self.inCount
|
||||||
mnSq = self.inSqSum/self.inCount
|
mnSq = self.inSqSum/self.inCount
|
||||||
yield (1, [self.inCount, mn, mnSq])
|
yield (1, [self.inCount, mn, mnSq])
|
||||||
|
|
||||||
def reduce(self, key, packedValues):
|
def reduce(self, key, packedValues):
|
||||||
cumVal=0.0; cumSumSq=0.0; cumN=0.0
|
cumN, cumVal, cumSumSq = 0.0, 0.0, 0.0
|
||||||
for valArr in packedValues: # 从输入流中获取值
|
for valArr in packedValues: # 从输入流中获取值
|
||||||
nj = float(valArr[0])
|
nj = float(valArr[0])
|
||||||
cumN += nj
|
cumN += nj
|
||||||
cumVal += nj*float(valArr[1])
|
cumVal += nj*float(valArr[1])
|
||||||
cumSumSq += nj*float(valArr[2])
|
cumSumSq += nj*float(valArr[2])
|
||||||
mean = cumVal/cumN
|
mean = cumVal/cumN
|
||||||
var = (cumSumSq - 2*mean*cumVal + cumN*mean*mean)/cumN
|
var = (cumSumSq - 2*mean*cumVal + cumN*mean*mean)/cumN
|
||||||
yield (mean, var) # 发出平均值和方差
|
yield (mean, var) # 发出平均值和方差
|
||||||
|
|
||||||
def steps(self):
|
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,)])
|
return ([self.mr(mapper=self.map, mapper_final=self.map_final, reducer=self.reduce,)])
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,34 +2,39 @@
|
|||||||
# coding:utf8
|
# coding:utf8
|
||||||
'''
|
'''
|
||||||
Created on 2017-04-06
|
Created on 2017-04-06
|
||||||
|
Update on 2017-06-20
|
||||||
Machine Learning in Action Chapter 18
|
Machine Learning in Action Chapter 18
|
||||||
Map Reduce Job for Hadoop Streaming
|
Map Reduce Job for Hadoop Streaming
|
||||||
@author: Peter Harrington/ApacheCn-xy
|
@author: Peter/ApacheCN-xy/片刻
|
||||||
'''
|
《机器学习实战》更新地址:https://github.com/apachecn/MachineLearning
|
||||||
|
|
||||||
|
|
||||||
'''
|
|
||||||
这个mapper文件按行读取所有的输入并创建一组对应的浮点数,然后得到数组的长度并创建NumPy矩阵。
|
|
||||||
再对所有的值进行平方,最后将均值和平方后的均值发送出去。这些值将用来计算全局的均值和方差。
|
|
||||||
|
|
||||||
Args:
|
|
||||||
file 输入数据
|
|
||||||
Return:
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
import sys
|
import sys
|
||||||
from numpy import mat, mean, power
|
from numpy import mat, mean, power
|
||||||
|
|
||||||
|
'''
|
||||||
|
这个mapper文件按行读取所有的输入并创建一组对应的浮点数,然后得到数组的长度并创建NumPy矩阵。
|
||||||
|
再对所有的值进行平方,最后将均值和平方后的均值发送出去。这些值将用来计算全局的均值和方差。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
file 输入数据
|
||||||
|
Return:
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
def read_input(file):
|
def read_input(file):
|
||||||
for line in file:
|
for line in file:
|
||||||
yield line.rstrip() # 返回值中包含输入文件的每一行的数据的一个大的List
|
yield line.rstrip() # 返回一个 yield 迭代器,每次获取下一个值,节约内存。
|
||||||
|
|
||||||
input = read_input(sys.stdin) # 创建一个输入的数据行的列表list
|
|
||||||
input = [float(line) for line in input] # 将得到的数据转化为 float 类型
|
input = read_input(sys.stdin) # 创建一个输入的数据行的列表list
|
||||||
numInputs = len(input) # 获取数据的个数,即输入文件的数据的行数
|
input = [float(line) for line in input] # 将得到的数据转化为 float 类型
|
||||||
input = mat(input) # 将 List 转换为矩阵
|
numInputs = len(input) # 获取数据的个数,即输入文件的数据的行数
|
||||||
sqInput = power(input,2) # 将矩阵的数据分别求 平方,即 2次方
|
input = mat(input) # 将 List 转换为矩阵
|
||||||
|
sqInput = power(input, 2) # 将矩阵的数据分别求 平方,即 2次方
|
||||||
|
|
||||||
# 输出 数据的个数,n个数据的均值,n个数据平方之后的均值
|
# 输出 数据的个数,n个数据的均值,n个数据平方之后的均值
|
||||||
print ("%d\t%f\t%f" % (numInputs, mean(input), mean(sqInput))) #计算均值
|
# 第一行是标准输出,也就是reducer的输出
|
||||||
print >> sys.stderr, "report: still alive"
|
# 第二行识标准错误输出,即对主节点作出的响应报告,表明本节点工作正常。
|
||||||
|
# 【这不就是面试的装逼重点吗?如何设计监听架构细节】注意:一个好的习惯是想标准错误输出发送报告。如果某任务10分钟内没有报告输出,则将被Hadoop中止。
|
||||||
|
print("%d\t%f\t%f" % (numInputs, mean(input), mean(sqInput))) # 计算均值
|
||||||
|
print >> sys.stderr, "map report: still alive"
|
||||||
|
|||||||
@@ -3,44 +3,44 @@
|
|||||||
|
|
||||||
'''
|
'''
|
||||||
Created on 2017-04-06
|
Created on 2017-04-06
|
||||||
|
Update on 2017-06-20
|
||||||
Machine Learning in Action Chapter 18
|
Machine Learning in Action Chapter 18
|
||||||
Map Reduce Job for Hadoop Streaming
|
Map Reduce Job for Hadoop Streaming
|
||||||
@author: Peter Harrington/ApacheCn-xy
|
@author: Peter/ApacheCN-xy/片刻
|
||||||
|
《机器学习实战》更新地址:https://github.com/apachecn/MachineLearning
|
||||||
'''
|
'''
|
||||||
|
import sys
|
||||||
|
|
||||||
'''
|
'''
|
||||||
mapper 接受原始的输入并产生中间值传递给 reducer。
|
mapper 接受原始的输入并产生中间值传递给 reducer。
|
||||||
很多的mapper是并行执行的,所以需要将这些mapper的输出合并成一个值。
|
很多的mapper是并行执行的,所以需要将这些mapper的输出合并成一个值。
|
||||||
即:将中间的 key/value 对进行组合。
|
即:将中间的 key/value 对进行组合。
|
||||||
'''
|
'''
|
||||||
import sys
|
|
||||||
from numpy import mat, mean, power
|
|
||||||
|
|
||||||
def read_input(file):
|
def read_input(file):
|
||||||
for line in file:
|
for line in file:
|
||||||
yield line.rstrip() # 返回值中包含输入文件的每一行的数据的一个大的List
|
yield line.rstrip() # 返回值中包含输入文件的每一行的数据的一个大的List
|
||||||
|
|
||||||
|
|
||||||
input = read_input(sys.stdin) # 创建一个输入的数据行的列表list
|
input = read_input(sys.stdin) # 创建一个输入的数据行的列表list
|
||||||
|
|
||||||
# 将输入行分割成单独的项目并存储在列表的列表中
|
# 将输入行分割成单独的项目并存储在列表的列表中
|
||||||
mapperOut = [line.split('\t') for line in input]
|
mapperOut = [line.split('\t') for line in input]
|
||||||
|
# 输入 数据的个数,n个数据的均值,n个数据平方之后的均值
|
||||||
print (mapperOut)
|
print (mapperOut)
|
||||||
|
|
||||||
# 累计样本总和,总和 和 总和 sq
|
# 累计样本总和,总和 和 平分和的总和
|
||||||
cumVal=0.0
|
cumN, cumVal, cumSumSq = 0.0, 0.0, 0.0
|
||||||
cumSumSq=0.0
|
|
||||||
cumN=0.0
|
|
||||||
for instance in mapperOut:
|
for instance in mapperOut:
|
||||||
nj = float(instance[0])
|
nj = float(instance[0])
|
||||||
cumN += nj
|
cumN += nj
|
||||||
cumVal += nj*float(instance[1])
|
cumVal += nj*float(instance[1])
|
||||||
cumSumSq += nj*float(instance[2])
|
cumSumSq += nj*float(instance[2])
|
||||||
|
|
||||||
#计算均值
|
|
||||||
mean = cumVal/cumN
|
|
||||||
meanSq = cumSumSq/cumN
|
|
||||||
|
|
||||||
#输出 数据总量,均值,平方的均值(方差)
|
# 计算均值( varSum是计算方差的展开形式 )
|
||||||
print ("%d\t%f\t%f" % (cumN, mean, meanSq))
|
mean_ = cumVal/cumN
|
||||||
print >> sys.stderr, "report: still alive"
|
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"
|
||||||
|
|||||||
Reference in New Issue
Block a user