- 签证留学 |
- 笔译 |
- 口译
- 求职 |
- 日/韩语 |
- 德语
在此不对该代码做过多分析,它只为Pegasos算法的MapReduce版本做一个铺垫。下面将在mrjob中建立并运行一个MapReduce版本的Pegasos算法。
2. 训练算法:用mrjob实现MapReduce版本的SVM
在此将用MapReduce来实现程序清单1的Pegasos算法,之后再用mrjob框架运行该算法。首先要明白如何将该算法划分成map阶段和reduce阶段,确认哪些可以并行,哪些不能并行。
对程序清单15-4的代码运行情况稍作观察将会发现,大量的时间花费在内积计算上。另外,内积运算可以并行,但创建新的权重变量w是不能并行的。这就是将算法改写为MapReduce作业的一个切入点。在编写mapper和reducer的代码之前,先完成一部分外围代码。打开文本编辑器,
创建一个新文件mrSVM.py,然后在该文件中添加下面程序清单的代码。
程序清单2 mrjob中分布式Pegasos算法的外围代码
程序清单2 的代码进行了一些设定,从而保证了map和reduce阶段的正确执行。在程序开头,Mrjob、NumPy和Pickle模块分别通过一条include语句导入。之后创建了一个mrjob类MRsvm,其中__init__()方法初始化了一些在map和reduce阶段用到的变量。Python的模块Pickle在加载不同版本的Python文件时会出现问题。为此,我将Python2.6和2.7两个版本对应的数据文件各自存为svmDat26和svmDat27。
对应于命令行输入的参数,configure_options()方法建立了一些变量,包括迭代次数(T)、待处理列表的大小(k)。这些参数都是可选的,如果未指定,它们将采用默认值。
最后,steps()方法告诉mrjob应该做什么,以什么顺序来做。它创建了一个Python的列表,包含map、map_fin和reduce这几个步骤,然后将该列表乘以迭代次数,即在每次迭代中重复调用这个列表。为了保证作业里的任务链能正确执行,mapper需要能够正确读取reducer输出的数据。单个MapReduce作业中无须考虑这个因素,这里需要特别注意输入和输出格式的对应。
我们对输入和输出格式进行如下规定:
Mapper
Inputs:
Outputs: nothing
Mapper_final
Inputs: nothing
Outputs:<1, valuelist="">
Reducer
Inputs:
Outputs:
传入的值是列表数组,valueList的第一个元素是一个字符串,用于表示列表的后面存放的是什么类型的数据,例如{'x',23)和['w',[1,5,6]]。每个mapper_final都将输出同样的key, 这是为了保证所有的key/value对都输出给同一个reducer。
定义好了输入和输出之后,下面开始写mapper和reducer方法,打开mrSVM.py文件并在MRsvm类中添加下面的代码。