diff --git a/bin/15_test.sh b/bin/15_test.sh new file mode 100644 index 00000000..17c87655 --- /dev/null +++ b/bin/15_test.sh @@ -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 diff --git a/docs/1.机器学习基础.md b/docs/1.机器学习基础.md index 864ccc9d..5f515f2f 100644 --- a/docs/1.机器学习基础.md +++ b/docs/1.机器学习基础.md @@ -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)** * [GitHub地址](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): -* **版权声明: 内容由[ApacheCN(apache中文网)](http://www.apache.wiki)更新维护,欢迎转载学习-记得标注信息来源,谢谢** +* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apache.wiki)** diff --git a/docs/13.利用PCA来简化数据.md b/docs/13.利用PCA来简化数据.md index 90bfb2bd..c1b44240 100644 --- a/docs/13.利用PCA来简化数据.md +++ b/docs/13.利用PCA来简化数据.md @@ -90,3 +90,9 @@ 如果使用在线PCA分析的方法,你可以参考一篇优秀的论文 "Incremental Eigenanalysis for Classification"。 下一章要讨论的奇异值分解方法也可以用于特征值分析。 ``` + +* * * + +* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian)** +* [GitHub地址](https://github.com/apachecn/MachineLearning): +* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apache.wiki)** diff --git a/docs/14.利用SVD简化数据.md b/docs/14.利用SVD简化数据.md index 0f769b5a..c6881ff9 100644 --- a/docs/14.利用SVD简化数据.md +++ b/docs/14.利用SVD简化数据.md @@ -1,6 +1,8 @@ # 第14章 利用SVD简化数据 +![利用SVD简化数据首页](/images/14.SVD/svd_headPage.jpg "利用SVD简化数据首页") + ``` 奇异值分解(SVD, Singular Value Decomposition): 提取信息的一种方法,可以把SVD看成是从噪声数据中抽取相关特征。从生物信息学到金融学,SVD是提出信息的强大工具。 @@ -115,3 +117,9 @@ * 1)在大型系统中,SVD分解(可以在程序调入时运行一次)每天运行一次或者其频率更低,并且还要离线运行。 * 2)在实际中,另一个普遍的做法就是离线计算并保存相似度得分。(物品相似度可能被用户重复的调用) * 3)冷启动问题,解决方案就是将推荐看成是搜索问题,通过各种标签/属性特征进行`基于内容的推荐`。 + +* * * + +* **作者:[片刻](http://www.apache.wiki/display/~jiangzhonglian) [1988](http://www.apache.wiki/display/~lihuisong)** +* [GitHub地址](https://github.com/apachecn/MachineLearning): +* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apache.wiki)** diff --git a/docs/15.大数据与MapReduce.md b/docs/15.大数据与MapReduce.md index 3fd7d388..17a02115 100644 --- a/docs/15.大数据与MapReduce.md +++ b/docs/15.大数据与MapReduce.md @@ -1,22 +1,21 @@ # 大数据与MapReduce -> 本章内容 +![大数据与MapReduce首页](/images/15.BigData_MapReduce/mr_headPage.jpg "大数据与MapReduce首页") -* MapReduce -* Python中Hadoop流的使用 -* 使用mrjob库将MapReduce自动化 -* 利用Pegasos算法并行训练支持向量机 +`大数据: 收集到的数据已经远远超出了我们的处理能力。` -## MapReduce:分布式计算的框架 +## MapReduce ``` -优点:可在短时间内完成大量工作。 -缺点:算法必须经过重写,需要对系统工程有一定的理解。 -适用数据类型:数值型和标称型数据。 +Hadoop 是 MapRedece框架的一个免费开源实现。 +MapReduce: 分布式的计算框架,可以将单个计算作业分配给多台计算机执行。 +优点: 使程序以并行的方式执行,可在短时间内完成大量工作。 +缺点: 算法必须经过重写,需要对系统工程有一定的理解。 +适用数据类型: 数值型和标称型数据。 ``` -* MapReduce集群的示意图 -![MapReduce集群的示意图](/images/15.BigData_MapReduce/MR_1_cluster.jpg) +* MapReduce框架的示意图 +* ![MapReduce框架的示意图](/images/15.BigData_MapReduce/mr_1_cluster.jpg) > 关于MapRduce的学习要点 @@ -27,16 +26,104 @@ * 数据被重复存放在不同的机器上,以防止某个机器实效 * 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上的机器学习 -## 在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): +* **版权声明:欢迎转载学习 => 请标注信息来源于 [ApacheCN](http://www.apache.wiki)** diff --git a/images/14.SVD/svd_headPage.jpg b/images/14.SVD/svd_headPage.jpg new file mode 100644 index 00000000..3c241cbc Binary files /dev/null and b/images/14.SVD/svd_headPage.jpg differ diff --git a/images/15.BigData_MapReduce/mr_headPage.jpg b/images/15.BigData_MapReduce/mr_headPage.jpg new file mode 100644 index 00000000..ca7a79b6 Binary files /dev/null and b/images/15.BigData_MapReduce/mr_headPage.jpg differ diff --git a/src/python/14.SVD/svdRec.py b/src/python/14.SVD/svdRec.py index bbecf9ea..9ecfd309 100644 --- a/src/python/14.SVD/svdRec.py +++ b/src/python/14.SVD/svdRec.py @@ -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 diff --git a/src/python/15.BigData_MapReduce/mrMean.py b/src/python/15.BigData_MapReduce/mrMean.py index 04dd7d1e..c58535e8 100644 --- a/src/python/15.BigData_MapReduce/mrMean.py +++ b/src/python/15.BigData_MapReduce/mrMean.py @@ -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,)]) diff --git a/src/python/15.BigData_MapReduce/mrMeanMapper.py b/src/python/15.BigData_MapReduce/mrMeanMapper.py index 8f05945d..86d2f696 100644 --- a/src/python/15.BigData_MapReduce/mrMeanMapper.py +++ b/src/python/15.BigData_MapReduce/mrMeanMapper.py @@ -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" diff --git a/src/python/15.BigData_MapReduce/mrMeanReducer.py b/src/python/15.BigData_MapReduce/mrMeanReducer.py index fe3a61c5..6a6f8ace 100644 --- a/src/python/15.BigData_MapReduce/mrMeanReducer.py +++ b/src/python/15.BigData_MapReduce/mrMeanReducer.py @@ -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"