1.简介
Ø基于用户的协同推荐算法随着使用者数量的增多,计算的时间就会变长,所以在2001年Sarwar提出了基于项目的协同过滤推荐算法(Item-based Collaborative Filtering Algorithms)。基于项目的协同过滤方法有一个基本的假设:“能够引起使用者兴趣的项目,必定与其之前评分高的项目相似”,通过计算项目之间的相似性来代替使用者之间的相似性。 基于项目的协同过滤不用考虑使用者间的差别,所以精度相对较差。但是却不需要使用者的历史资料,或是进行使用者识别。对于项目来讲,它们之间的相似性要稳定很多,因此可以离线完成工作量最大的相似性计算步骤,从而降低了线上计算量,提高推荐效率,尤其是在使用者多于项目的情形下尤为显著。
ØMahout基于Item的分布式推荐算法的主要内容见org.apache.mahout.cf.taste.hadoop.item
基于 item 的推荐方法假设:能够引起用户兴趣的 item ,必定与其评分高的 item 相似。主要包括三个步骤: (1) 得到每个用户对 item 的评分数据; (2) 对 item 进行最近邻的搜索; (3) 产生推荐。
2.数据
使用wikipedia页面链接数据库(page-to-page link database),使用Henry Haselgrove整理好的部分数据集links-simple-sorted.zip
3.目标
为页面推荐相关的链接页面。
4.程序
使用Mahout基于item推荐的分布式实现 org.apache.mahout.cf.taste.hadoop.item.RecommenderJob,详细代码见:
mahout-distributied-0.7/core/src/main/java/org/apache/mahout/cf/taste/hadoop/item/
RecommenderJob.java.
5.步骤
Ø数据准备
l下载links-simple-sorted.zip,解压得到links-simple-sorted.txt,重新格式化文件,生成input.txt数据文件;新建users.txt文件,按行存放要求推荐的用户编号,实验中只为编号为3的用户做推荐;将input.txt和users.txt放在WikiPedia/input目录中,该步骤已经完成,WikiPedia文件夹存放在hdfs:/share/data/ Mahout_examples_Data_Set中
l将WikiPedia放在hdfs的用户根目录下
user@hadoop:$hadoop dfs -cp /share/data/Mahout_examples_Data_Set/WikiPedia/ .
Ø执行推荐步骤
user@hadoop:$mahout org.apache.mahout.cf.taste.hadoop.item.RecommenderJob -i WikiPedia/input/input.txt -o WikiPedia/output -s SIMILARITY_COOCCURRENCE --usersFile WikiPedia/input/users.txt
Ø查看结果
user@hadoop:$hadoop dfs -cat WikiPedia/output/part-r-0000
默认情况下,mahout使用的reduce数目为1,这样造成大数据处理时效率较低,可以通过参数mahout执行脚本中的MAHOUT_OPTS中的-Dmapred.reduce.tasks参数指定reduce数目。
6 处理流程
Mahout 中基于 item 的推荐包括 12 个 MapReduce 过程。下面对每一个 MapReduce 的作用进行描述。 输入的数据以userid “\t” itemid “\t” perferenceValue 格式输入,分别表示用户编号、产品编号和该用户对该产品的评分值。
(1) 第 1 个 MapReduce :将 itemID 长整型映射到整型的序号上。这样做的目的是为后续以该序号为矩阵的一个维度,所以需要处理成整型。
(2) 第 2 个 MapReduce :统计每个用户对哪些 item 进行了评分,评分值是多少。
(3) 第 3 个 MapReduce :统计用户的总数。
(4) 第 4 个 MapReduce :统计每个 item 被哪些用户评分了,评分值是多少。
(5) 第 5,6,7 个 MapReduce :计算每个 item 与所有 item 之间的相似度。
(6) 第 8 个 MapReduce :将相同 item 之间的相似度置为 NaN 。
(7) 第 9 个 MapReduce :确定要推荐的用户,这些用户对哪些 item 进行了评分,评分值是多少。
(8) 第 10 个 MapReduce :根据以上的统计结果得到每个 item 与其他 item 之间的相似度,这些 item 分别被哪些用户评分了,评分值是多少。
(9) 第 11 个 MapReduce :过滤掉指定用户不需要推荐的 item 。
(10) 第 12 个 MapReduce :得到每个用户要推荐的 item 。这些 item 对于该用户来说是评分最高的前 n 个。
7 算法流程 参数
--output 输出路径
--input 输入路劲
-n 为每个用户推荐的产品数
-u 待推荐的用户列表
-i 待推荐的 item 列表
-f 过滤指定用户不需要推荐的 item 。格式为 userID, itemID 对
-b 输入的样本不带产品评分
-mp 设置每个用户喜好的最大数量 默认 10
-m 设置每个用户喜好的最小数量 默认 1
-mo 样本抽样
-s 相似度量方法。包括:
SIMILARITY_URRENCE(DistributedurrenceVectorSimilarity.class),
SIMILARITY_EUCLIDEAN_DISTANCE(DistributedEuclideanDistanceVectorSimilarity.class),
SIMILARITY_LOGLIKELIHOOD(DistributedLoglikelihoodVectorSimilarity.class),
SIMILARITY_PEARSON_CORRELATION(DistributedPearsonCorrelationVectorSimilarity.class),
SIMILARITY_TANIMOTO_COEFFICIENT(DistributedTanimotoCoefficientVectorSimilarity.class),
SIMILARITY_UNCENTERED_COSINE(DistributedUncenteredCosineVectorSimilarity.class),
SIMILARITY_UNCENTERED_ZERO_ASSUMING_COSINE(DistributedUncenteredZeroAssumingCosineVectorSimilarity.class),
SIMILARITY_CITY_BLOCK(DistributedCityBlockVectorSimilarity.class);