1. 程式人生 > >Mahout之推薦演算法基本例項

Mahout之推薦演算法基本例項

Mahout中主要核心的三大演算法為推薦,聚類及分類演算法,今天就最基本的推薦演算法做總結,推薦中常用的兩個推薦演算法是”user_based”和”item_based”,前者主要通過和你興趣相似的人來發現新的你感興趣的東西,而後者則是發現一些和你所喜歡的事物相似的事物。此外,還有一種基於“contend_based”的推薦演算法,它是根據事物所擁有的元資料出現進行事物的推薦,例如,如果你喜歡的電影是斯皮爾伯格導影的,那麼你可以向你的朋友推薦他拍攝的其他影片,推薦的理由就是基於電影的一個屬性——導演,這個就是基於內容的推薦。

下面將使用mahout來做一個小的推薦案例以供學習:

1.構建資料集


這裡選取的常用的偏好來描述使用者與專案之間的關聯程度,一個偏好包含有使用者ID,專案ID和偏好值,例如,使用者對影片的評分值,評分值越大,代表使用者對該影片的喜愛越好。
可以採用文字檔案來儲存該內容,如intro.csv:

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推薦合適的影片,程式碼如下:

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利用所有的元件來為一個使用者產生一個推薦結果。

4.執行結果展示
利用eclipse執行該程式碼的結果如下所示:
結果
可以看到該推薦器向用戶1推薦了104,106這兩部影片,其中104是推薦偏好量化值最高的一部

5.推薦器評估
高效準確地產生推薦結果是非常重要的,推薦的結果一般要求準、新、普,準要求推薦的結果可靠真實,新要求推薦的結果具有新奇性,不與往常重複,普則要求推薦的結果是為大眾所接受的。評估的一般做法是將資料集分成訓練集和測試集,然後選擇指標進行評估說明。
常用的幾個指標有:

  • 差值平均數(真實與預期值)
  • 標註差(差值均方根)
  • 查準率與查全率

下面利用差值平均數進行評估,程式碼如下:

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表示選取資料集的百分比。

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及以上版本搭配才可能不會出錯的。