由於course project需要,我最近看了一下Mahout的推薦實現。最初看到的是這篇文章。裏面的代碼毫無問題,不過引包的時候錯誤重重。因此重新寫一下,希望能幫助到有同樣問題的同學。廢話不多說,上代碼:
public static void main(String[] args) throws Exception { System.out.println("1"); File f = new File("C:/Users/Administrator/Desktop/test.txt"); System.out.println("2"); //導入數據,計算相似度 DataModel model = new FileDataModel(f); UserSimilarity similarity = new PearsonCorrelationSimilarity(model); //根據數據與相似度,再計算K緊鄰 UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model); //根據以上三個數據建立推薦引擎 Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity); //直接調用引擎,爲用戶1推薦兩個ItemID。 List<RecommendedItem> recommendations = recommender.recommend(1, 2); for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation); } }
代碼上來看,跟那位同學的完全一樣,我就直接粘貼過來的。引入的包與結果如下:
既然我們已經知道了如何搭建最簡單的Mahout推薦模型,那現在我們就來稍微詳細地瞭解一下Mahout吧。Mahout屬於Hadoop家族,給我的理解,只要能夠使用MapReduce這種功能就算是Hadoop家族。Mahout能做三種事:聚類,分類以及推薦。我們使用的推薦功能,能夠以兩種策略推薦。假設說我們想給Amazon上的用戶Tom推薦一些商品,UserCF就是找出與Tom的口味相似的用戶,看看他們都喜歡什麼,然後將這些東西推薦給Tom。ItemCF就是先看看Tom喜歡什麼,然後看看對於這些東西有沒有相似的物品能夠推薦。
這張圖很好地解釋了剛剛寫的代碼中各個步驟之間的依賴關係。我是從Mahout學習路線裏面找到的。ItemCF的代碼如下。輸入的是某個商品的id,得到的是跟這個商品類似的id。
//1.導入數據 DataModel dm = new FileDataModel(new File("data/user_preferences.csv")); //2.計算物品之間的相似度 ItemSimilarity sim = new LogLikelihoodSimilarity(dm); //3.構建ItemBase的推薦引擎 GenericItemBasedRecommender recommender = new GenericItemBasedRecommender(dm, sim); //4.得到推薦列表 List<RecommendedItem> recommendations = recommender.mostSimilarItems(itemID, size); for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation); }
DataModel dm = new FileDataModel(f); ItemSimilarity sim = new LogLikelihoodSimilarity(dm); Recommender recommender = new GenericItemBasedRecommender(dm, sim); Recommender cachingRecommender=new CachingRecommender(recommender); List<RecommendedItem> recommendations = cachingRecommender.recommend(1, 7); for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation); }
這段代碼輸入的是user的ID以及需要的推薦數,能夠綜合考慮當前用戶喜歡的商品,然後給出一個推薦列表。