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算法框架自帶的推薦器有下面這些:
- 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ù)和文件中讀取用戶的喜好信息。
UserSimilarity
和 ItemSimilarity
。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。
UserSimilarity
和 ItemSimilarity
相似度實(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è)步驟:
- 從UserNeighborhood獲取當(dāng)前用戶Ui最相似的K個(gè)用戶集合{U1, U2, …Uk};
- 從這K個(gè)用戶集合排除Ui的偏好商品,剩下的Item集合為{Item0, Item1, …Itemm};
- 對(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
其他參考資料:
- 用Hadoop構(gòu)建電影推薦系統(tǒng)(自己實(shí)現(xiàn)分布式)
- 用Mahout構(gòu)建職位推薦引擎(單機(jī))
- Mahout構(gòu)建圖書推薦系統(tǒng)(單機(jī))
- Mahout分步式程序開(kāi)發(fā) 基于物品的協(xié)同過(guò)濾ItemCF(調(diào)用接口)
- mahout分布式:Item-based推薦
- Introduction to Item-Based Recommendations with Hadoop
- 使用Mahout搭建推薦系統(tǒng)之入門篇4-Mahout實(shí)戰(zhàn)
- 基于MapReduce的ItemBase推薦算法的共現(xiàn)矩陣實(shí)現(xiàn)