Mahout Item-based推薦的分布式實(shí)現(xiàn)


title: Mahout Item-based推薦的分布式實(shí)現(xiàn)
date: 2016/7/25 16:02:36
tags:

  • Mahout
  • 推薦系統(tǒng)
    categories: 大數(shù)據(jù)

Mahout API地址:http://apache.github.io/mahout/0.10.1/docs/mahout-mr/overview-summary.html

Mahout推薦算法API詳解

Mahout算法框架自帶的推薦器有下面這些:

  • GenericUserBasedRecommender:基于用戶的推薦器,用戶數(shù)量少時(shí)速度快;
  • GenericItemBasedRecommender:基于商品推薦器,商品數(shù)量少時(shí)速度快,尤其當(dāng)外部提供了商品相似度數(shù)據(jù)后效率更好;
  • SlopeOneRecommender:基于slope-one算法的推薦器,在線推薦或更新較快,需要事先大量預(yù)處理運(yùn)算,物品數(shù)量少時(shí)較好;
  • SVDRecommender:奇異值分解,推薦效果較好,但之前需要大量預(yù)處理運(yùn)算;
  • KnnRecommender:基于k近鄰算法(KNN),適合于物品數(shù)量較小時(shí);
  • TreeClusteringRecommender:基于聚類的推薦器,在線推薦較快,之前需要大量預(yù)處理運(yùn)算,用戶數(shù)量較少時(shí)效果好;
  • Mahout最常用的三個(gè)推薦器是上述的前三個(gè),本文主要討論前兩種的使用。

接口相關(guān)介紹

基于用戶或物品的推薦器主要包括以下幾個(gè)接口:

DataModel 是用戶喜好信息的抽象接口,它的具體實(shí)現(xiàn)支持從任意類型的數(shù)據(jù)源抽取用戶喜好信息。Taste 默認(rèn)提供 JDBCDataModel 和 FileDataModel,分別支持從數(shù)據(jù)庫(kù)和文件中讀取用戶的喜好信息。
UserSimilarityItemSimilarity。UserSimilarity 用于定義兩個(gè)用戶間的相似度,它是基于協(xié)同過(guò)濾的推薦引擎的核心部分,可以用來(lái)計(jì)算用戶的“鄰居”,這里我們將與當(dāng)前用戶口味相似的用戶稱為他的鄰居。ItemSimilarity 類似的,計(jì)算內(nèi)容之間的相似度。
UserNeighborhood 用于基于用戶相似度的推薦方法中,推薦的內(nèi)容是基于找到與當(dāng)前用戶喜好相似的鄰居用戶的方式產(chǎn)生的。UserNeighborhood 定義了確定鄰居用戶的方法,具體實(shí)現(xiàn)一般是基于 UserSimilarity 計(jì)算得到的。
Recommender 是推薦引擎的抽象接口,Taste 中的核心組件。程序中,為它提供一個(gè) DataModel,它可以計(jì)算出對(duì)不同用戶的推薦內(nèi)容。實(shí)際應(yīng)用中,主要使用它的實(shí)現(xiàn)類 GenericUserBasedRecommender 或者 GenericItemBasedRecommender,分別實(shí)現(xiàn)基于用戶相似度的推薦引擎或者基于內(nèi)容的推薦引擎。
RecommenderEvaluator:評(píng)分器。
RecommenderIRStatsEvaluator:搜集推薦性能相關(guān)的指標(biāo),包括準(zhǔn)確率、召回率等等。
目前,Mahout為DataModel提供了以下幾種實(shí)現(xiàn):

  • org.apache.mahout.cf.taste.impl.model.GenericDataModel
  • org.apache.mahout.cf.taste.impl.model.GenericBooleanPrefDataModel
  • org.apache.mahout.cf.taste.impl.model.PlusAnonymousUserDataModel
  • org.apache.mahout.cf.taste.impl.model.file.FileDataModel
  • org.apache.mahout.cf.taste.impl.model.hbase.HBaseDataModel
  • org.apache.mahout.cf.taste.impl.model.cassandra.CassandraDataModel
  • org.apache.mahout.cf.taste.impl.model.mongodb.MongoDBDataModel
  • org.apache.mahout.cf.taste.impl.model.jdbc.SQL92JDBCDataModel
  • org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel
  • org.apache.mahout.cf.taste.impl.model.jdbc.PostgreSQLJDBCDataModel
  • org.apache.mahout.cf.taste.impl.model.jdbc.GenericJDBCDataModel
  • org.apache.mahout.cf.taste.impl.model.jdbc.SQL92BooleanPrefJDBCDataModel
  • org.apache.mahout.cf.taste.impl.model.jdbc.MySQLBooleanPrefJDBCDataModel
  • org.apache.mahout.cf.taste.impl.model.jdbc.PostgreBooleanPrefSQLJDBCDataModel
  • org.apache.mahout.cf.taste.impl.model.jdbc.ReloadFromJDBCDataModel
    從類名上就可以大概猜出來(lái)每個(gè)DataModel的用途,奇怪的是竟然沒(méi)有HDFS的DataModel,有人實(shí)現(xiàn)了一個(gè),請(qǐng)參考MAHOUT-1579

UserSimilarityItemSimilarity 相似度實(shí)現(xiàn)有以下幾種:

  • CityBlockSimilarity:基于Manhattan距離相似度
  • EuclideanDistanceSimilarity:基于歐幾里德距離計(jì)算相似度
  • LogLikelihoodSimilarity:基于對(duì)數(shù)似然比的相似度
  • PearsonCorrelationSimilarity:基于皮爾遜相關(guān)系數(shù)計(jì)算相似度
  • SpearmanCorrelationSimilarity:基于皮爾斯曼相關(guān)系數(shù)相似度
  • TanimotoCoefficientSimilarity:基于谷本系數(shù)計(jì)算相似度
  • UncenteredCosineSimilarity:計(jì)算 Cosine 相似度
    以上相似度的說(shuō)明,請(qǐng)參考Mahout推薦引擎介紹。

UserNeighborhood 主要實(shí)現(xiàn)有兩種:

  • NearestNUserNeighborhood:對(duì)每個(gè)用戶取固定數(shù)量N個(gè)最近鄰居
  • ThresholdUserNeighborhood:對(duì)每個(gè)用戶基于一定的限制,取落在相似度限制以內(nèi)的所有用戶為鄰居

Recommender分為以下幾種實(shí)現(xiàn):

  • GenericUserBasedRecommender:基于用戶的推薦引擎
  • GenericBooleanPrefUserBasedRecommender:基于用戶的無(wú)偏好值推薦引擎
  • GenericItemBasedRecommender:基于物品的推薦引擎
  • GenericBooleanPrefItemBasedRecommender:基于物品的無(wú)偏好值推薦引擎

RecommenderEvaluator有以下幾種實(shí)現(xiàn):

  • AverageAbsoluteDifferenceRecommenderEvaluator:計(jì)算平均差值
  • RMSRecommenderEvaluator:計(jì)算均方根差
  • RecommenderIRStatsEvaluator的實(shí)現(xiàn)類是GenericRecommenderIRStatsEvaluator。

單機(jī)運(yùn)行

首先,需要在maven中加入對(duì)mahout的依賴:

<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-core</artifactId>
    <version>0.9</version>
</dependency>

<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-integration</artifactId>
    <version>0.9</version>
</dependency>

<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-math</artifactId>
    <version>0.9</version>
</dependency>

<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-examples</artifactId>
    <version>0.9</version>
</dependency>

基于用戶的推薦,以FileDataModel為例:

File modelFile modelFile = new File("intro.csv");

DataModel model = new FileDataModel(modelFile);

//用戶相似度,使用基于皮爾遜相關(guān)系數(shù)計(jì)算相似度
UserSimilarity similarity = new PearsonCorrelationSimilarity(model);

//選擇鄰居用戶,使用NearestNUserNeighborhood實(shí)現(xiàn)UserNeighborhood接口,選擇鄰近的4個(gè)用戶
UserNeighborhood neighborhood = new NearestNUserNeighborhood(4, similarity, model);

Recommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);

//給用戶1推薦4個(gè)物品
List<RecommendedItem> recommendations = recommender.recommend(1, 4);

for (RecommendedItem recommendation : recommendations) {
    System.out.println(recommendation);
}

注意: FileDataModel要求輸入文件中的字段分隔符為逗號(hào)或者制表符,如果你想使用其他分隔符,你可以擴(kuò)展一個(gè)FileDataModel的實(shí)現(xiàn),例如,mahout中已經(jīng)提供了一個(gè)解析MoiveLens的數(shù)據(jù)集(分隔符為::)的實(shí)現(xiàn)GroupLensDataModel。

GenericUserBasedRecommender是基于用戶的簡(jiǎn)單推薦器實(shí)現(xiàn)類,推薦主要參照傳入的DataModel和UserNeighborhood,總體是三個(gè)步驟:

  1. 從UserNeighborhood獲取當(dāng)前用戶Ui最相似的K個(gè)用戶集合{U1, U2, …Uk};
  2. 從這K個(gè)用戶集合排除Ui的偏好商品,剩下的Item集合為{Item0, Item1, …Itemm};
  3. 對(duì)Item集合里每個(gè)Itemj計(jì)算Ui可能偏好程度值pref(Ui, Itemj),并把Item按此數(shù)值從高到低排序,前N個(gè)item推薦給用戶Ui。

對(duì)相同用戶重復(fù)獲得推薦結(jié)果,我們可以改用CachingRecommender來(lái)包裝GenericUserBasedRecommender對(duì)象,將推薦結(jié)果緩存起來(lái):

Recommender cachingRecommender = new CachingRecommender(recommender);

上面代碼可以在main方法中直接運(yùn)行,然后,我們可以獲取推薦模型的評(píng)分:

//使用平均絕對(duì)差值獲得評(píng)分
RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();
// 用RecommenderBuilder構(gòu)建推薦引擎
RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
    @Override
    public Recommender buildRecommender(DataModel model) throws TasteException {
        UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
        UserNeighborhood neighborhood = new NearestNUserNeighborhood(4, similarity, model);
        return new GenericUserBasedRecommender(model, neighborhood, similarity);
    }
};
// Use 70% of the data to train; test using the other 30%.
double score = evaluator.evaluate(recommenderBuilder, null, model, 0.7, 1.0);
System.out.println(score);

接下來(lái),可以獲取推薦結(jié)果的查準(zhǔn)率和召回率:

RecommenderIRStatsEvaluator statsEvaluator = new GenericRecommenderIRStatsEvaluator();
// Build the same recommender for testing that we did last time:
RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
    @Override
    public Recommender buildRecommender(DataModel model) throws TasteException {
        UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
        UserNeighborhood neighborhood = new NearestNUserNeighborhood(4, similarity, model);
        return new GenericUserBasedRecommender(model, neighborhood, similarity);
    }
};
// 計(jì)算推薦4個(gè)結(jié)果時(shí)的查準(zhǔn)率和召回率
IRStatistics stats = statsEvaluator.evaluate(recommenderBuilder,null, model, null, 4,
        GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD,1.0);
System.out.println(stats.getPrecision());
System.out.println(stats.getRecall());

如果是基于物品的推薦,代碼大體相似,只是沒(méi)有了UserNeighborhood,然后將上面代碼中的User換成Item即可,完整代碼如下:

File modelFile modelFile = new File("intro.csv");

DataModel model = new FileDataModel(new File(file));

// Build the same recommender for testing that we did last time:
RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
    @Override
    public Recommender buildRecommender(DataModel model) throws TasteException {
        ItemSimilarity similarity = new PearsonCorrelationSimilarity(model);
        return new GenericItemBasedRecommender(model, similarity);
    }
};

//獲取推薦結(jié)果
List<RecommendedItem> recommendations = recommenderBuilder.buildRecommender(model).recommend(1, 4);

for (RecommendedItem recommendation : recommendations) {
    System.out.println(recommendation);
}

//計(jì)算評(píng)分
RecommenderEvaluator evaluator =
        new AverageAbsoluteDifferenceRecommenderEvaluator();
// Use 70% of the data to train; test using the other 30%.
double score = evaluator.evaluate(recommenderBuilder, null, model, 0.7, 1.0);
System.out.println(score);

//計(jì)算查全率和查準(zhǔn)率
RecommenderIRStatsEvaluator statsEvaluator = new GenericRecommenderIRStatsEvaluator();

// Evaluate precision and recall "at 2":
IRStatistics stats = statsEvaluator.evaluate(recommenderBuilder,
        null, model, null, 4,
        GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD,
        1.0);
System.out.println(stats.getPrecision());
System.out.println(stats.getRecall());

在Spark中運(yùn)行

在Spark中運(yùn)行,需要將Mahout相關(guān)的jar添加到Spark的classpath中,修改/etc/spark/conf/spark-env.sh,添加下面兩行代碼:

SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/mahout/lib/*"
SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/usr/lib/mahout/*"

然后,以本地模式在spark-shell中運(yùn)行下面代碼交互測(cè)試:

//注意:這里是本地目錄
val model = new FileDataModel(new File("intro.csv"))

val evaluator = new RMSRecommenderEvaluator()
val recommenderBuilder = new RecommenderBuilder {
  override def buildRecommender(dataModel: DataModel): Recommender = {
    val similarity = new LogLikelihoodSimilarity(dataModel)
    new GenericItemBasedRecommender(dataModel, similarity)
  }
}

val score = evaluator.evaluate(recommenderBuilder, null, model, 0.95, 0.05)
println(s"Score=$score")

val recommender=recommenderBuilder.buildRecommender(model)
val users=trainingRatings.map(_.user).distinct().take(20)

import scala.collection.JavaConversions._

val result=users.par.map{user=>
  user+","+recommender.recommend(user,40).map(_.getItemID).mkString(",")
}

https://github.com/sujitpal/mia-scala-examples上面有一個(gè)評(píng)估基于物品或是用戶的各種相似度下的評(píng)分的類,叫做 RecommenderEvaluator,供大家學(xué)習(xí)參考。

分布式運(yùn)行

Mahout提供了org.apache.mahout.cf.taste.hadoop.item.RecommenderJob類以MapReduce的方式來(lái)實(shí)現(xiàn)基于物品的協(xié)同過(guò)濾,查看該類的使用說(shuō)明:

ubuntu@Master:~/data$ mahout org.apache.mahout.cf.taste.hadoop.item.RecommenderJob
MAHOUT_LOCAL is not set; adding HADOOP_CONF_DIR to classpath.
Running on hadoop, using /home/ubuntu/hadoop/bin/hadoop and HADOOP_CONF_DIR=/home/ubuntu/hadoop/etc/hadoop
MAHOUT-JOB: /home/ubuntu/apache-mahout-distribution-0.10.1/mahout-examples-0.10.1-job.jar
16/07/25 07:41:32 WARN driver.MahoutDriver: No org.apache.mahout.cf.taste.hadoop.item.RecommenderJob.props found on classpath, will use command-line arguments only
16/07/25 07:41:33 ERROR common.AbstractJob: Missing required option --similarityClassname
Missing required option --similarityClassname                                   
Usage:                                                                          
 [--input <input> --output <output> --numRecommendations <numRecommendations>   
--usersFile <usersFile> --itemsFile <itemsFile> --filterFile <filterFile>       
--userItemFile <userItemFile> --booleanData <booleanData> --maxPrefsPerUser     
<maxPrefsPerUser> --minPrefsPerUser <minPrefsPerUser> --maxSimilaritiesPerItem  
<maxSimilaritiesPerItem> --maxPrefsInItemSimilarity <maxPrefsInItemSimilarity>  
--similarityClassname <similarityClassname> --threshold <threshold>             
--outputPathForSimilarityMatrix <outputPathForSimilarityMatrix> --randomSeed    
<randomSeed> --sequencefileOutput --help --tempDir <tempDir> --startPhase       
<startPhase> --endPhase <endPhase>]                                             
--similarityClassname (-s) similarityClassname    Name of distributed           
                                                  similarity measures class to  
                                                  instantiate, alternatively    
                                                  use one of the predefined     
                                                  similarities                  
                                                  ([SIMILARITY_COOCCURRENCE,    
                                                  SIMILARITY_LOGLIKELIHOOD,     
                                                  SIMILARITY_TANIMOTO_COEFFICIEN
                                                  T, SIMILARITY_CITY_BLOCK,     
                                                  SIMILARITY_COSINE,            
                                                  SIMILARITY_PEARSON_CORRELATION
                                                  ,                             
                                                  SIMILARITY_EUCLIDEAN_DISTANCE]
                                                  )  

也可輸入mahout org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --help查看詳細(xì)說(shuō)明

可見(jiàn),該類可以接收的命令行參數(shù)如下:

--input(path)(-i): 存儲(chǔ)用戶偏好數(shù)據(jù)的目錄,該目錄下可以包含一個(gè)或多個(gè)存儲(chǔ)用戶偏好數(shù)據(jù)的文本文件;
--output(path)(-o): 結(jié)算結(jié)果的輸出目錄
--numRecommendations (integer): 為每個(gè)用戶推薦的item數(shù)量,默認(rèn)為10
--usersFile (path): 指定一個(gè)包含了一個(gè)或多個(gè)存儲(chǔ)userID的文件路徑,僅為該路徑下所有文件包含的userID做推薦計(jì)算 (該選項(xiàng)可選)
--itemsFile (path): 指定一個(gè)包含了一個(gè)或多個(gè)存儲(chǔ)itemID的文件路徑,僅為該路徑下所有文件包含的itemID做推薦計(jì)算 (該選項(xiàng)可選)
--filterFile (path): 指定一個(gè)路徑,該路徑下的文件包含了[userID,itemID]值對(duì),userID和itemID用逗號(hào)分隔。計(jì)算結(jié)果將不會(huì)為user推薦[userID,itemID]值對(duì)中包含的item (該選項(xiàng)可選)
--booleanData (boolean): 如果輸入數(shù)據(jù)不包含偏好數(shù)值,則將該參數(shù)設(shè)置為true,默認(rèn)為false
--maxPrefsPerUser (integer): 在最后計(jì)算推薦結(jié)果的階段,針對(duì)每一個(gè)user使用的偏好數(shù)據(jù)的最大數(shù)量,默認(rèn)為10
--minPrefsPerUser (integer): 在相似度計(jì)算中,忽略所有偏好數(shù)據(jù)量少于該值的用戶,默認(rèn)為1
--maxSimilaritiesPerItem (integer): 針對(duì)每個(gè)item的相似度最大值,默認(rèn)為100
--maxPrefsPerUserInItemSimilarity (integer): 在item相似度計(jì)算階段,針對(duì)每個(gè)用戶考慮的偏好數(shù)據(jù)最大數(shù)量,默認(rèn)為1000
--similarityClassname (classname): 向量相似度計(jì)算類
outputPathForSimilarityMatrix:SimilarityMatrix輸出目錄
--randomSeed:隨機(jī)種子 –sequencefileOutput:序列文件輸出路徑
--tempDir (path): 存儲(chǔ)臨時(shí)文件的目錄,默認(rèn)為當(dāng)前用戶的home目錄下的temp目錄
--startPhase
--endPhase
--threshold (double): 忽略相似度低于該閥值的item對(duì)

一個(gè)例子如下,使用SIMILARITY_LOGLIKELIHOOD相似度推薦物品:

$ hadoop jar /usr/lib/mahout/mahout-examples-0.9-cdh5.4.0-job.jar org.apache.mahout.cf.taste.hadoop.item.RecommenderJob --input /tmp/mahout/part-00000 --output /tmp/mahout-out  -s SIMILARITY_LOGLIKELIHOOD

自己運(yùn)行的例子如下:

部分實(shí)驗(yàn)數(shù)據(jù):

1    25    0.0136316222
1    116    0.0090877481
1    5    0.0045438741
1    23    0.1862988368
1    17    0.0272632444
1    3    1.4122360602
1    11    0.0363509925
1    12    0.4543874068
1    120    0.0027263244
1    93    0.0136316222
1    21    0.0036350993
1    6    0.7688234922
1    47    0.0018175496
1    66    0.0454387407
1    27    0.0254456948
1    44    0.0245369200
1    315    0.0045438741
1    28    0.0545264888
1    138    0.0636142369
1    108    0.0045438741
1    1    7.2695320732
1    85    12.5188577359
1    168    0.0545264888
10    4    0.6772009029
10    6    0.6772009029
10    217    0.0112866817
10    2    1.7607223476
10    1    1.8735891648
100    25    0.4788867023
100    5    0.0047793084
100    17    0.2915378128
100    26    0.0047793084
100    3    0.1194827101
100    11    0.6987348890
100    4    0.6652797301
100    12    0.0047793084
100    30    0.0736013495
100    32    0.5257239247
100    31    0.0076468934
100    37    0.0430137757
100    29    0.0592634242
100    44    0.0009558617
100    13    4.4313747540
100    1    9.5461906101
100    10    0.0439696373
1000    8    0.2902055623
1000    14    0.0483675937
1000    5    0.0725513906
1000    9    0.0725513906
1000    26    0.3869407497
1000    3    0.1451027811
1000    436    0.0120918984
1000    2    3.9177750907
1000    15    2.4304715840
ubuntu@Master:~/data$ mahout org.apache.mahout.cf.taste.hadoop.item.RecommenderJob -i /test/item/ckm_pre_result1000000.txt -o /test/item/outputPersonCorr --similarityClassname org.apache.mahout.math.hadoop.similarity.cooccurrence.measures.PearsonCorrelationSimilarity

部分結(jié)果:

1    [196:10.482155,14:9.271373,145:8.875873,177:7.779633,360:7.537198,114:7.1917353,635:7.085346,75:6.8879533,235:6.796164,210:6.586777]
2    [386:4.339762,631:4.2806735,194:4.274664,153:4.1018524,362:3.7975848,934:3.422003,195:3.0110214,188:2.7676048,30:2.6990044,746:2.693153]
3    [45:4.2422075,212:4.1731844,270:3.9618893,309:3.960001,204:3.933118,275:3.6498196,321:3.6286862,179:3.487534,240:3.3450491,170:3.28568]
4    [293:4.3900704,746:3.9469879,51:3.3795352,52:3.3444872,312:2.818981,24:2.719058,649:2.2690945,28:2.1947412,196:2.170363,145:2.008545]
5    [590:1.1531421,332:1.1508745,336:1.134177,852:1.1335075,561:1.121143,36:1.1099223,535:1.0878772,129:1.0850264,236:1.0413511,83:1.0349866]

默認(rèn)情況下,mahout使用的reduce數(shù)目為1,這樣造成大數(shù)據(jù)處理時(shí)效率較低,可以通過(guò)參數(shù)mahout執(zhí)行腳本中的MAHOUT_OPTS中的-Dmapred.reduce.tasks參數(shù)指定reduce數(shù)目。

上面命令運(yùn)行完成之后,會(huì)在當(dāng)前用戶的hdfs主目錄生成temp目錄,該目錄可由--tempDir (path)參數(shù)設(shè)置:

$ hadoop fs -ls temp
Found 10 items
-rw-r--r--   3 root hadoop          7 2015-06-10 14:42 temp/maxValues.bin
-rw-r--r--   3 root hadoop    5522717 2015-06-10 14:42 temp/norms.bin
drwxr-xr-x   - root hadoop          0 2015-06-10 14:41 temp/notUsed
-rw-r--r--   3 root hadoop          7 2015-06-10 14:42 temp/numNonZeroEntries.bin
-rw-r--r--   3 root hadoop    3452222 2015-06-10 14:41 temp/observationsPerColumn.bin
drwxr-xr-x   - root hadoop          0 2015-06-10 14:47 temp/pairwiseSimilarity
drwxr-xr-x   - root hadoop          0 2015-06-10 14:52 temp/partialMultiply
drwxr-xr-x   - root hadoop          0 2015-06-10 14:39 temp/preparePreferenceMatrix
drwxr-xr-x   - root hadoop          0 2015-06-10 14:50 temp/similarityMatrix
drwxr-xr-x   - root hadoop          0 2015-06-10 14:42 temp/weights

觀察yarn的管理界面,該命令會(huì)生成9個(gè)任務(wù),任務(wù)名稱依次是:

  • PreparePreferenceMatrixJob-ItemIDIndexMapper-Reducer
  • PreparePreferenceMatrixJob-ToItemPrefsMapper-Reducer
  • PreparePreferenceMatrixJob-ToItemVectorsMapper-Reducer
  • RowSimilarityJob-CountObservationsMapper-Reducer
  • RowSimilarityJob-VectorNormMapper-Reducer
  • RowSimilarityJob-CooccurrencesMapper-Reducer
  • RowSimilarityJob-UnsymmetrifyMapper-Reducer
  • partialMultiply
  • RecommenderJob-PartialMultiplyMapper-Reducer

從任務(wù)名稱,大概可以知道每個(gè)任務(wù)在做什么,如果你的輸入?yún)?shù)不一樣,生成的任務(wù)數(shù)可能不一樣,這個(gè)需要測(cè)試一下才能確認(rèn)。

在hdfs上查看輸出的結(jié)果,用戶和推薦結(jié)果用\t分隔,推薦結(jié)果中物品之間用逗號(hào)分隔,物品后面通過(guò)冒號(hào)連接評(píng)分:

843 [10709679:4.8334665,8389878:4.833426,9133835:4.7503786,10366169:4.7503185,9007487:4.750272,8149253:4.7501993,10366165:4.750115,9780049:4.750108,8581254:4.750071,10456307:4.7500467]
6253    [10117445:3.0375953,10340299:3.0340924,8321090:3.0340924,10086615:3.032164,10436801:3.0187714,9668385:3.0141575,8502110:3.013954,10476325:3.0074399,10318667:3.0004222,8320987:3.0003839]

使用Java API方式執(zhí)行,請(qǐng)參考Mahout分步式程序開(kāi)發(fā) 基于物品的協(xié)同過(guò)濾ItemCF

在Scala或者Spark中,可以以Java API或者命令方式運(yùn)行,最后還可以通過(guò)Spark來(lái)處理推薦的結(jié)果,例如:過(guò)濾、去重、補(bǔ)足數(shù)據(jù),這部分內(nèi)容不做介紹。

本文基本轉(zhuǎn)載自:轉(zhuǎn)載自JavaChen Blog,作者:JavaChen,文章地址http://blog.javachen.com/2015/06/10/collaborative-filtering-using-mahout.html

其他參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容