Mahout之推薦算法基本實例

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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);  
    } 
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

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);
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

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

相關文章
相關標籤/搜索