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