推荐的定义
推荐算法可以分为三大类,基于用户的,基于物品的和基于内容的,前两者均属于协同过滤的范畴,仅仅通过用户与物品之间的关系进行推荐,无需了解物品自身的属性。而几乎内容的推荐技术很有用,但是必须与特定领域相结合,比如推荐一本书就必须了解书的属性,作者,颜色,内容等等。但是这些知识无法转移到其他领域,比如基于内容的图书推荐就对推荐哪道菜比较好吃毫无用处。
所有mahout对基于内容的推荐涉及很少。
基于用户的推荐
算法
基于用户的推荐算法来源与对相似用户爱好的总结,一般过程如下:
for (用户u尚未表达偏好的) 每个物品i
for(对i有偏好的)每个其他用户v
计算u和v之间的相似度s
按权重为s将v对i的偏好并入平均值
return 值最高的物品(按加权平均排序)
看上去挺简单,但是,每个物品都检查速度太慢,一般会先计算出一个最相似用户的领域,然后仅考虑这些用户评价过的物品。
for(每个其他用户w)
计算用户u与用户w的相似度s
按相似度排序后,将位置靠前的用户作为领域n
for(n中用户有偏好,而用户u无偏好的)每个物品i
for(n中用户对i有偏好的)每个其他用户v
计算用户u与v的相似度s
按权重s将v对i的偏好计入平均值
return 值最高的物品
mahout的具体实现
根据以上算法,可以具体化为以下步骤:
1. 数据模型,由DataModel实现
2. 用户间的相似性度量,由UserSimilarity实现
3. 用户邻域的定义,由UserNeighborhood实现
4. 推荐引擎,由一个Recommender实现
一个具体的例子如下:
//存储并计算提供计算所需的偏好,用户以及物品数据
DataModel model =
new FileDataModel(new File("D:\\mahoutData\\intro.csv"));
//比较两个用户之间的相似度
UserSimilarity similarity =
new PearsonCorrelationSimilarity(model);
//明确与给定用户最相似的一组用户
UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);
//合并上述所有组件为用户推荐物品
Recommender recommender = new GenericUserBasedRecommender(
model, neighborhood, similarity);
List<RecommendedItem> recommendations =
recommender.recommend(1, 1);
for