- 簽證留學(xué) |
- 筆譯 |
- 口譯
- 求職 |
- 日/韓語(yǔ) |
- 德語(yǔ)
在此不對(duì)該代碼做過(guò)多分析,它只為Pegasos算法的MapReduce版本做一個(gè)鋪墊。下面將在mrjob中建立并運(yùn)行一個(gè)MapReduce版本的Pegasos算法。
2. 訓(xùn)練算法:用mrjob實(shí)現(xiàn)MapReduce版本的SVM
在此將用MapReduce來(lái)實(shí)現(xiàn)程序清單1的Pegasos算法,之后再用mrjob框架運(yùn)行該算法。首先要明白如何將該算法劃分成map階段和reduce階段,確認(rèn)哪些可以并行,哪些不能并行。
對(duì)程序清單15-4的代碼運(yùn)行情況稍作觀察將會(huì)發(fā)現(xiàn),大量的時(shí)間花費(fèi)在內(nèi)積計(jì)算上。另外,內(nèi)積運(yùn)算可以并行,但創(chuàng)建新的權(quán)重變量w是不能并行的。這就是將算法改寫(xiě)為MapReduce作業(yè)的一個(gè)切入點(diǎn)。在編寫(xiě)mapper和reducer的代碼之前,先完成一部分外圍代碼。打開(kāi)文本編輯器,
創(chuàng)建一個(gè)新文件mrSVM.py,然后在該文件中添加下面程序清單的代碼。
程序清單2 mrjob中分布式Pegasos算法的外圍代碼
程序清單2 的代碼進(jìn)行了一些設(shè)定,從而保證了map和reduce階段的正確執(zhí)行。在程序開(kāi)頭,Mrjob、NumPy和Pickle模塊分別通過(guò)一條include語(yǔ)句導(dǎo)入。之后創(chuàng)建了一個(gè)mrjob類MRsvm,其中__init__()方法初始化了一些在map和reduce階段用到的變量。Python的模塊Pickle在加載不同版本的Python文件時(shí)會(huì)出現(xiàn)問(wèn)題。為此,我將Python2.6和2.7兩個(gè)版本對(duì)應(yīng)的數(shù)據(jù)文件各自存為svmDat26和svmDat27。
對(duì)應(yīng)于命令行輸入的參數(shù),configure_options()方法建立了一些變量,包括迭代次數(shù)(T)、待處理列表的大?。╧)。這些參數(shù)都是可選的,如果未指定,它們將采用默認(rèn)值。
最后,steps()方法告訴mrjob應(yīng)該做什么,以什么順序來(lái)做。它創(chuàng)建了一個(gè)Python的列表,包含map、map_fin和reduce這幾個(gè)步驟,然后將該列表乘以迭代次數(shù),即在每次迭代中重復(fù)調(diào)用這個(gè)列表。為了保證作業(yè)里的任務(wù)鏈能正確執(zhí)行,mapper需要能夠正確讀取reducer輸出的數(shù)據(jù)。單個(gè)MapReduce作業(yè)中無(wú)須考慮這個(gè)因素,這里需要特別注意輸入和輸出格式的對(duì)應(yīng)。
我們對(duì)輸入和輸出格式進(jìn)行如下規(guī)定:
Mapper
Inputs:
Outputs: nothing
Mapper_final
Inputs: nothing
Outputs:<1, valuelist="">
Reducer
Inputs:
Outputs:
傳入的值是列表數(shù)組,valueList的第一個(gè)元素是一個(gè)字符串,用于表示列表的后面存放的是什么類型的數(shù)據(jù),例如{'x',23)和['w',[1,5,6]]。每個(gè)mapper_final都將輸出同樣的key, 這是為了保證所有的key/value對(duì)都輸出給同一個(gè)reducer。
定義好了輸入和輸出之后,下面開(kāi)始寫(xiě)mapper和reducer方法,打開(kāi)mrSVM.py文件并在MRsvm類中添加下面的代碼。