推荐器实现类在:
org.apache.mahout.cf.taste.Hadoop.item.RecommenderJob。其输入数据放在默认输入目录下,使用mapred.input.dir参数指定的输入数据,是userID,itemID[,preferencevalue]值对形成的文本文件。可以有多个文件存放在该目录下。
运行时相关参数如下:
numRecommendations:为每个用户产生的推荐个数 "Number of recommendations per user"
usersFile:包含待推荐用户的用户ID列表;
itemsFile:包含待推荐项目的项目ID列表;
filterFile:用来做推荐过滤的训练文件,内容为使用逗号分隔的userID,itemID对,
booleanData:不带推荐值的训练数据文件;
maxPrefsPerUser:Maximum number of preferences considered per user in final recommendation phase;
minPrefsPerUser:ignore users with less preferences than this in the similarity computation ; maxSimilaritiesPerItem:Maximum number of similarities considered per item;
maxurrencesPerItem:try to cap the number of urrences per item to this;
similarityClassname:Name of distributed similarity class to instantiate, alternatively use one of the predefined similarities,可用的相似度类有:
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);
RecommendJob运行一系列MR任务,在开发时,可以根据自己的需要进行改写。但是RecommendJob申明成final,这个比较头疼。
1.itemIDIndex 任务:
map:解析输入的itemsFile;将长整型的ID通过算法映射到整形的序号上,以便后续处理。由于处理中涉及到矩阵计算,每一个项目对应矩阵中的一个维度,所以必须处理成整形;产生序号-ID值对;
reducer:对序号-ID对进行验证,产生序号-ID值对;
2.toUserVector任务:
ToItemPrefsMapper:从filterFile中读取偏好信息,转成用户-偏好值对。
ToUserVectorReducer:将用户-偏好*,转成用户-偏好矢量对,矢量表即为所有的ItemID。
3.countUsers 任务:计算用户数量,输出为用户数量--空。
4.maybePruneAndTransponse,一个名称很奇怪的任务。
MaybePruneRowsMapper:输入为任务2的输出,生成针对每个item项目的推荐值矩阵单元,即Item序号和矩阵单元的值对。
ToItemVectorsReducer:输出为矩阵行号(即Item序号)-矩阵行矢量
5. RowSimilarityJob: 计算相似度矩阵:这是引用一个现有的任务来完成计算,输入为任务4输出的矩阵;输出为相似度矩阵,即item-相似度矢量。其中相似度矢量是当前item和其他item的相似度值形成的矢量。
6. prePartialMultiply1:输入为任务5的输出,将相似度矩阵中的对角线行,即(N,N)数值设置为Double.NaN,为后续计算做准备;
7. prePartialMultiply2:输入为任务2的输出,将user-(项目矢量),拆分成item-(userId, 推荐值)对。如果设置了usersFile,则仅处理usersFile中指定的用户。
8. partialMultiply: 合并任务6和7的额输出,变成item-(相似度矢量、userId、推荐值) 对。
9. itemFiltering:如果有filterFile,则处理filterFile文件,转换成item-(相似度矢量、userId、推荐值)对。其中相似度矢量的值为0;
aggregateAndRecommend:将8和9的输出合并作为输入,
PartialMultiplyMapper: 将item-(相似度矢量、userId、推荐值)集转换成userId-(推荐值,相似度矢量)值对;
AggregateAndRecommendReducer:汇总map输出,产生userId-((itemId, 推荐值)列表)值对,其中(itemId, 推荐值)列表是按照推荐度来排序,如果maxPrefsPerUser、minPrefsPerUser、maxurrencesPerItem,则只产 生符合条件的userId值对。