Mahout中主要核心的三大算法爲推薦,聚類及分類算法,今天就最基本的推薦算法作總結,推薦中經常使用的兩個推薦算法是」user_based」和」item_based」,前者主要經過和你興趣類似的人來發現新的你感興趣的東西,然後者則是發現一些和你所喜歡的事物類似的事物。此外,還有一種基於「contend_based」的推薦算法,它是根據事物所擁有的元數據出現進行事物的推薦,例如,若是你喜歡的電影是斯皮爾伯格導影的,那麼你能夠向你的朋友推薦他拍攝的其餘影片,推薦的理由就是基於電影的一個屬性——導演,這個就是基於內容的推薦。java
下面將使用mahout來作一個小的推薦案例以供學習:算法
1.構建數據集
這裏選取的經常使用的偏好來描述用戶與項目之間的關聯程度,一個偏好包含有用戶ID,項目ID和偏好值,例如,用戶對影片的評分值,評分值越大,表明用戶對該影片的喜好越好。
能夠採用文本文件來保存該內容,如intro.csv:apache
1,101,5.0 1,102,3.0 1,103,2.5 2,101,2.0 2,102,2.5 2,103,5.0 2,104,2.0 3,101,2.5 3,104,4.0 3,105,4.5 3,107,5.0 4,101,5.0 4,103,3.0 4,104,4.5 4,106,4.0 5,101,4.0 5,102,3.0 5,103,2.0 5,104,4.0 5,105,3.5 5,106,4.0
2.創建簡易推薦器
下面利用mathou提供的基本類包mahout-examples-0.10.0-job.jar來構建java代碼程序,咱們要實現的是根據用戶的基本狀況向User1推薦合適的影片,代碼以下:dom
package com.recommeder.lg.example; import org.apache.mahout.cf.taste.impl.model.file.*; import org.apache.mahout.cf.taste.impl.neighborhood.*; import org.apache.mahout.cf.taste.impl.recommender.*; import org.apache.mahout.cf.taste.impl.similarity.*; import org.apache.mahout.cf.taste.model.*; import org.apache.mahout.cf.taste.neighborhood.*; import org.apache.mahout.cf.taste.recommender.*; import org.apache.mahout.cf.taste.similarity.*; import java.io.*; import java.util.*; class RecommenderIntro { public static void main(String[] args) throws Exception { DataModel model = new FileDataModel(new File("/home/jinyu/Documents/intro.csv"));//加載數據文件 UserSimilarity similarity = new PearsonCorrelationSimilarity (model); //創建推薦模型 UserNeighborhood neighborhood = new NearestNUserNeighborhood (2, similarity, model); Recommender recommender = new GenericUserBasedRecommender ( model, neighborhood, similarity); List<RecommendedItem > recommendations = recommender.recommend(1, 2); //給用戶1推薦2個項目 for (RecommendedItem recommendation : recommendations) { System.out.println(recommendation); } } }
3.相關解釋說明
該代碼是基於用戶推薦的基本流程,用圖表示出來就是:
DataModel負責存儲和提供用戶、項目、偏好的計算所須要的數據。UserSimiliarity提供了一些基於某種
算法的用戶類似度度量的方法。UserNeighborhood定義了一個和某指定用戶類似的用戶集合。最後,Recommender利用全部的組件來爲一個用戶產生一個推薦結果。eclipse
4.運行結果展現
利用eclipse運行該代碼的結果以下所示:
能夠看到該推薦器向用戶1推薦了104,106這兩部影片,其中104是推薦偏好量化值最高的一部分佈式
5.推薦器評估
高效準確地產生推薦結果是很是重要的,推薦的結果通常要求準、新、普,準要求推薦的結果可靠真實,新要求推薦的結果具備新奇性,不與往常重複,普則要求推薦的結果是爲大衆所接受的。評估的通常作法是將數據集分紅訓練集和測試集,而後選擇指標進行評估說明。
經常使用的幾個指標有:ide
下面利用差值平均數進行評估,代碼以下:函數
import java.io.File; import org.apache.mahout.cf.taste.common.TasteException; import org.apache.mahout.cf.taste.eval.*; import org.apache.mahout.cf.taste.impl.eval.*; import org.apache.mahout.cf.taste.impl.model.file.*; import org.apache.mahout.cf.taste.impl.neighborhood.*; import org.apache.mahout.cf.taste.impl.recommender.*; import org.apache.mahout.cf.taste.impl.similarity.*; import org.apache.mahout.cf.taste.model.*; import org.apache.mahout.cf.taste.neighborhood.*; import org.apache.mahout.cf.taste.recommender.*; import org.apache.mahout.cf.taste.similarity.*; import org.apache.mahout.common.RandomUtils; class RecommenderEvaluators { public static void main(String[] args) throws Exception { RandomUtils.useTestSeed(); DataModel model = new FileDataModel(new File("intro.csv"));//加載數據文件 RecommenderEvaluator evalutor= new AverageAbsoluteDifferenceRecommenderEvaluator(); RecommenderBuilder builder=new RecommenderBuilder() { @Override public Recommender buildRecommender(DataModel model) throws TasteException { // TODO Auto-generated method stu UserSimilarity similarity = new PearsonCorrelationSimilarity (model); //創建推薦模型 UserNeighborhood neighborhood = new NearestNUserNeighborhood (2, similarity, model); return new GenericUserBasedRecommender (model,neighborhood,similarity); } }; double score =evalutor.evaluate(builder, null, model, 0.6, 1); System.out.println(score); } }
最後的evaluate()函數爲推薦器評分,分值越低,表明差別越小,評估的效果越準確,其中0.6表示訓練集的百分比,1表示選取數據集的百分比。oop
6.分佈式推薦計算學習
當數據量足夠大時,單機環境已經不適用於作推薦計算了,這是能夠考慮mahout提供的分佈式推薦算法在hadoop平臺下進行計算,能夠把上述數據集上傳到hdfs下的文件夾,而後利用recommenditembased命令進行分佈式推薦計算,其適用的數據類型通常是偏好型,如果對向量數據進行類似度的計算,則能夠考慮適用rowsimilarity命令,其主要參數可使用mahout recommenditembased -h命令查看,運行命令以下:
mahout recommenditembased -i testdata/pre.data -o output/similar -s SIMILARITY_EUCLIDEAN_DISTANCE -n 3 -opfsm output/matrix
其中,-i 指出數據集存放地址,-o 存放推薦結果,-s 指出類似度計算的函數,-n 指出爲每一個用戶推薦的數量,最後一個opfsm存放item間的類似度。
此外,hdfs下額外的產生的temp文件夾也有許多可查看文件,以下圖:
不過,值得注意的事,儘管數據量很小,可是hadoop下的mapreduce過程仍然花費了必定的時間,還有,hadoop2.2與mahout1.0及以上版本搭配纔可能不會出錯的。