Mahout 0.8版本的ItemBased推荐使用方法:
运行命令:
1
2
|
mahout recommenditembased --input inputPath --output outputPath --similarityClassname similarityMathod
[--usersFile --itemsFile --filterFile -- numRecommendations --booleanData --maxPrefsPerUser --maxSimilaritiesPerItem --minPrefsPerUser --maxPrefsPerUserInItemSimilarity --threshold]
|
几个注意点:
1、–input,–output,–similarityClassname三个是必须的参数,其他可以为空(有默认值)
2、–usersFile,–itemsFile,–filterFile三个后面的参数是文件路径,不是目录。其中usersFile的格式为一行一个userid,itemFile的格式为一行一个itemid,filterFile的格式为userid,itemid
3、如果输入数据格式为userid,itemid。则–booleanData需设置true,默认为false
4、–maxPrefsPerUser 用来设置每个用户对item评分的数量的阀值,大于阀值的对其进行抽样,抽样个数为阀值大小,–minPrefsPerUser相反,小于它的阀值的将被剔除,其默认值为1。
5、–threshold用来设置item之间相似度的阀值,小于阀值的将被剔除。
下面大概介绍下itembased推荐在mahout中的流程:
1、运行itembased算法的类为:org.apache.mahout.cf.taste.hadoop.item.RecommenderJob,在mahout core包下
2、在RecommenderJob中首先调用PreparePreferenceMatrixJob,分别产生四种数据:
(1)itemid映射为index的数据(itemIDIndex),格式为key为index(Int),value为itemid(Long)的sequencefile(2)用户向量数据(userVectors),格式为key为userid(Long),value为(preference1 preference2 …)(vector)的sequencefile,其中itemid对应的index为preference在vector中的index。
(3)用户总个数数据(numUsers.bin)(4)item向量数据(ratingMatrix),格式为key为item_index(int),value为(preference1 preference2 …)(vector)的sequencefile,其中userid对应的index为preference在vector中的index。
3、然后又调用RowSimilarityJob,以ratingMatrix作为输入数据,计算item与item之间的相似度,计算过程大概为分两个MR job,第一个job先对preference进行标准化,并转化为userid_index,(itemid_index,preference…)输出,第二个job才真正的计算相似度,结果格式为key为item_a-index(int),value为(similarity1 similarity2…)(vector)的sequencefile,其中item_b_index为similarity对应的index,保存于similarityMatrixPath。(通过添加–outputPathForSimilarityMatrix参数,可以将相似度结果保存起来)
4、继续运行partialMultiply job,将PreparePreferenceMatrixJob产生的userVectors和RowSimilarityJob产生的similarityMatrixPath进行合并,结果格式为key为item_index,value为(similarity1 similarity2…)(vector) [userid1 userid2...] [preference1 preferene2...](VectorAndPrefsWritable)的sequencefile.
5、最后判断是否有–filterFile参数,有则先运行过滤job,否则直接运行预测评分job,预测每个用户对未评分item的评分值,计算预测评分格式为:Prediction(u,i) = sum(all n from N: similarity(i,n) * rating(u,n)) / sum(all n from N: abs(similarity(i,n)))
其中u为用户,i为预测评分的item,n为u评分过的item,然后对每个用户对item的预测评分取topk(默认10)个结果输出。