更新完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

19
bin/15_test.sh Normal file
View 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

View File

@@ -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)更新维护,欢迎转载学习-记得标注信息来源,谢谢**

View File

@@ -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)**

View File

@@ -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简化数据首页](/images/14.SVD/svd_headPage.jpg "利用SVD简化数据首页")
``` ```
奇异值分解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)**

View File

@@ -1,22 +1,21 @@
# 大数据与MapReduce # 大数据与MapReduce
> 本章内容 ![大数据与MapReduce首页](/images/15.BigData_MapReduce/mr_headPage.jpg "大数据与MapReduce首页")
* MapReduce `大数据: 收集到的数据已经远远超出了我们的处理能力。`
* Python中Hadoop流的使用
* 使用mrjob库将MapReduce自动化
* 利用Pegasos算法并行训练支持向量机
## MapReduce:分布式计算的框架 ## MapReduce
``` ```
优点:可在短时间内完成大量工作 Hadoop 是 MapRedece框架的一个免费开源实现
缺点:算法必须经过重写,需要对系统工程有一定的理解 MapReduce: 分布式的计算框架,可以将单个计算作业分配给多台计算机执行
适用数据类型:数值型和标称型数据 优点: 使程序以并行的方式执行,可在短时间内完成大量工作
缺点: 算法必须经过重写,需要对系统工程有一定的理解。
适用数据类型: 数值型和标称型数据。
``` ```
* MapReduce集群的示意图 * MapReduce框架的示意图
![MapReduce集群的示意图](/images/15.BigData_MapReduce/MR_1_cluster.jpg) * ![MapReduce框架的示意图](/images/15.BigData_MapReduce/mr_1_cluster.jpg)
> 关于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)**

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

View File

@@ -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

View File

@@ -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,)])

View File

@@ -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"

View File

@@ -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"