一、Mahout是什么?

Mahout是Apache的一個開源項目(http://mahout.apache.org/),提供了機器學習領域的若干經典算法,以便開發人員快速構建機器學習和數據挖掘方面的應用。
Mahout是基於Hadoop的。從名稱上看也很有意思,Hadoop是一個大象的名字,而Mahout則是象夫、看象人,可見二者聯系之緊密。(這讓我自然聯想到Sun和Eclipse...)
我此時是一個完全沒用過Mahout的門外漢,對Hadoop也沒有實際使用經驗,算是真正的零基礎。我的目標是希望以最簡單的方式搭建起一個Mahout的開發環境,以最快的速度讓Mahout工作起來,以方便后續的進一步學習。
於是,經過一番折騰,便有了本文。本文記錄了Windows下Eclipse+Maven+Mahout單機環境的搭建過程。我不知道這是不是最簡單的Mahout開發環境,但它應該算得上是比較簡單的。
二、安裝Eclipse
這個沒啥說的,再怎么零基礎,也要會用Eclipse吧。
Eclipse的下載地址為:http://www.eclipse.org/downloads/,選擇標准版就行。
安裝完后運行Eclipse,為后續的安裝做好准備。
三、安裝Maven
Maven又是什么?這里只需要知道它是一個項目管理工具就行,有了它,可以非常方面的安裝Mahout和相關依賴組件。
Maven的官方網站為:http://maven.apache.org/,它是一個命令行工具,這里我們安裝的是它的Eclipse插件版本(m2eclipse),其地址為:http://www.eclipse.org/m2e/,已安裝Maven的朋友可以跳過本小節。
下面是m2eclipse的安裝方法。
進入的下載頁面:http://www.eclipse.org/m2e/download/

安裝m2eclipse方法有兩種,一種是在上面的Install圖標上按下鼠標,然后拖動到Eclipse的窗口(看哪里能夠釋放鼠標就拖到哪里,比如標題欄),稍后就會彈出如下對話框,點擊“Confirm”即可。

第二種方法是通過Eclipse幫助菜單下的安裝新軟件(Install New Software)安裝:

點了上面菜單后,會彈出如下對話框,點擊Add按鈕,然后輸入Name和Location(http://download.eclipse.org/technology/m2e/releases),Location是從前面的網頁里面復制而來。

確定后,會顯示如下內容,選擇所有項目,然后點擊Next

同意授權,點擊Finish,Maven插件就會自動被安裝。

安裝完畢后,可通過Help > About > Installation Details確認已安裝的插件。

四、使用Maven構建Mahout項目
運行Eclipse,通過菜單File > New > Project新建項目,選擇Maven Project

直接Next

選擇maven-archetype-quickstart

輸入GroupId和ArtifactId,可以根據自己喜好隨便命名:

點了Finish后,Eclipse便會創建如下一個工程:

雙擊pom.xml,在右邊的面板中選擇Dependencies,點擊Add,在彈出的對話框中輸入mahout,Maven便會搜索相關包,選擇mahout-core,確定。

然后按Ctrl+S保存 pom.xml,maven便會下載相關jar包,在項目的Dependencies目錄下可以看到這些jar包。

到此,我們的環境就已搭建完畢,接下來便是編寫代碼。
五、編寫代碼,運行程序
雙擊App.java,對其進行編輯。

作為初次嘗試,肯定要選比較簡單的算法,這里我采用的是基於用戶的協同過濾算法來計算推薦商品。完整代碼如下:
1 package com.mine.mahout.practice; 2 3 import java.io.File; 4 import java.util.List; 5 6 import org.apache.mahout.cf.taste.impl.model.file.FileDataModel; 7 import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood; 8 import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender; 9 import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity; 10 import org.apache.mahout.cf.taste.model.DataModel; 11 import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood; 12 import org.apache.mahout.cf.taste.recommender.RecommendedItem; 13 import org.apache.mahout.cf.taste.recommender.Recommender; 14 import org.apache.mahout.cf.taste.similarity.UserSimilarity; 15 16 17 public class App 18 { 19 public static void main( String[] args ) 20 { 21 try { 22 // 從文件加載數據 23 DataModel model = new FileDataModel(new File("e:\\data.csv")); 24 // 指定用戶相似度計算方法,這里采用皮爾森相關度 25 UserSimilarity similarity = new PearsonCorrelationSimilarity(model); 26 // 指定用戶鄰居數量,這里為2 27 UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model); 28 // 構建基於用戶的推薦系統 29 Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); 30 // 得到指定用戶的推薦結果,這里是得到用戶1的兩個推薦 31 List<RecommendedItem> recommendations = recommender.recommend(1, 2); 32 // 打印推薦結果 33 for (RecommendedItem recommendation : recommendations) { 34 System.out.println(recommendation); 35 } 36 } catch (Exception e) { 37 System.out.println(e); 38 } 39 } 40 }
上面的e:\data.csv為數據文件,數據的第一列為用戶ID,第二列為商品ID,第三列為用戶對商品的評分:
1,101,5 1,102,3 1,103,2.5 2,101,2 2,102,2.5 2,103,5 2,104,2 3,101,2.5 3,104,4 3,105,4.5 3,107,5 4,101,5 4,103,3 4,104,4.5 4,106,4 5,101,4 5,102,3 5,103,2 5,104,4 5,105,3.5 5,106,4
(備注:上面的代碼和測試數據均參考自這篇博文:http://blog.csdn.net/aidayei/article/details/6626699)
接下來就可以運行程序了,選擇Java Application:

選擇App,或者前面直接對App.java執行運行,而不用對整個項目執行運行。

最后得到輸出結果如下:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. RecommendedItem[item:104, value:4.257081] RecommendedItem[item:106, value:4.0]
可以看到,Mahout為用戶1提供了兩個推薦商品,分別是104和106。
這樣,我們便完成了第一個Mahout程序,整個過程還算簡單吧?希望對“零基礎”的朋友有所幫助。
補充:前面的運行結果顯示三行紅字,說是slf4j里面的StaticLoggerBinder加載失敗,雖說它不影響程序運行結果,但看着實在煩人,解決辦法是再次編輯pom.xml的dependencies,添加一個slf4j-nop包即可。

(本文已移至個人網站freefalcon.cn)
