为豆瓣电影实现Item-based协同过滤的推荐系统

标签: 推荐系统 协同过滤,mahout 大数据 | 发表时间:2015-12-03 11:00 | 作者:
出处:http://colobu.com/

前面的两篇文章分别使用Spark mllib ALS实现了Model-based协同过滤推荐系统和使用Mahout实现了User-based的协同过滤推荐系统。
我们再来回顾一下item-base CF算法的特点:

  • 物品数明显小于用户数的场合,否则物品相似度矩阵计算代价很大
  • 适合长尾物品丰富,用户个性化需求强的领域
  • 对新用户友好,对新物品不友好,因为物品相似度矩阵不需要很强的实时性
  • 利用用户历史行为做推荐解释,比较令用户信服

所以item-base挺适合做电影的推荐。当用户浏览某个电影的时候,我们可以推荐给他类似的电影,或者根据用户以前的观影记录,推荐他感兴趣的电影。
本文还是以mahout 非分布式计算的方式实现。因为电影的记录比较少(166条),计算量不是很大。

代码也非常的简单,我们还是以皮尔逊算法计算相似度:

     
1
2
3
4
5
6
7
8
9
10
11
12
     
public class DoubanItemBasedRecommender {
public static void main(String[] args) throws Exception {
String base = args[0];
File file = new File(base + "user_movies.csv");
DoubanFileDataModel model = new DoubanFileDataModel(file);
ItemSimilarity similarity = new PearsonCorrelationSimilarity(model);
ItemBasedRecommender recommender = new GenericItemBasedRecommender(model, similarity);
BatchItemSimilarities batch = new MultithreadedBatchItemSimilarities(recommender, 5);
int numSimilarities = batch.computeItemSimilarities(Runtime.getRuntime().availableProcessors(), 1, new FileSimilarItemsWriter(new File(base + "item_result.csv")));
System.out.println("Computed " + numSimilarities + " similarities for " + model.getNumItems() + " items " + "and saved them to file " + base + "item_result.csv");
}
}

8行和第 9行使用多线程批处理的方式,把计算结果写入到一个文件中。
生成的文件如下:

     
1
2
3
4
5
6
7
8
9
10
     
......
25821461,26253733,0.8279288411140442
25821461,26252196,0.819756031036377
25821461,26366634,0.8181818127632141
25821461,25919385,0.7033082246780396
25821585,26328118,0.794719398021698
25821585,22556810,0.7655318379402161
25821585,1972724,0.6770924925804138
25821585,25809260,0.6347297430038452
......

电影 25821461 的信息如下:

和它相似度比较高的电影如下:

推荐还算不错,基本都属于剧情,喜剧类型, 而且都是国外的,没有给推荐战争,科幻或者武侠类的。

相关 [豆瓣 电影 item] 推荐:

为豆瓣电影实现Item-based协同过滤的推荐系统

- - 鸟窝
前面的两篇文章分别使用Spark mllib ALS实现了Model-based协同过滤推荐系统和使用Mahout实现了User-based的协同过滤推荐系统. 我们再来回顾一下item-base CF算法的特点:. 物品数明显小于用户数的场合,否则物品相似度矩阵计算代价很大. 适合长尾物品丰富,用户个性化需求强的领域.

阿北:豆瓣电影评分八问

- - 博客园_新闻
这是一篇豆瓣创始人&CEO 阿北(杨勃)刚刚发表的 长文,始终被认为理想主义的阿北,在文中阐明了豆瓣电影评分的原则和做法,用以保护公众对豆瓣评分的信任. 随着“豆瓣的电影评分在影视行业的影响越来越大”,阿北说豆瓣收到的威逼利诱也多起来……以下为全文. (豆瓣 CEO 阿北,图片来自 Qdaily).

Java豆瓣电影爬虫——抓取电影详情和电影短评数据

- - ImportNew
采集豆瓣电影数据包括电影详情页数据和电影的短评数据. 需要保存这些详情字段如导演、编剧、演员等还有图中右下方的标签. 需要保存的字段有短评所属的电影名称,每条评论的详细信息如评论人名称、评论内容等. 有了如上的需求,需要设计表,其实很简单,只需要一张电影详情表movie和一张电影短评表comments,另外还需要一张存储网页提取的超链接的记录表record.

豆瓣9.0分以上的好电影,值得收藏

- sky - 情迷好莱坞 – Mtime时光网
地球脉动 Planet Earth. 导演 : Alastair Fothergill. 主演 : David Attenborough/Sigourney Weaver. 评分:9.7  ★★★★★. 肖申克的救赎 The Shawshank Redemption. 导演 : Frank Darabont.

豆瓣电影2011年度清单总汇

- - 人在旅“图”
2011豆瓣电影年度总榜单,豆瓣红人影志整理,很全很强大. 2011是否遗漏了哪些好电影,参考比对一下吧. 所选范畴为2011年上映或发行的国内外所有影片,根据豆瓣用户评分+看过(在看)人数排序. ★  2011豆瓣电影【欧美20佳】. 勇士 Warrior 8.8 17872. 浮生一日 Life in a Day 8.8 11879.

算法工程师如何改进豆瓣电影 TOP250

- - 豆瓣blog
影迷们经常关注的电影排行榜里,一部由100人评出9.0分的电影,和一部由10000人评出8.0分的电影,谁应该排在前面呢. 这是我们算法工程师时常会面对的问题. 一些深度影迷可能会想到 imdb.com (互联网电影数据库) 所采用的贝叶斯公式[见附注],这个公式的思路就是通过每部影片的[评分人数]作为调节排序的杠杆:如果这部影片的评分人数低于一个预设值,则影片的最终得分会向全部影片的平均分拉低.

使用Spark MLlib给豆瓣用户推荐电影

- - 鸟窝
推荐算法就是利用用户的一些行为,通过一些数学算法,推测出用户可能喜欢的东西. 随着电子商务规模的不断扩大,商品数量和种类不断增长,用户对于检索和推荐提出了更高的要求. 由于不同用户在兴趣爱好、关注领域、个人经历等方面的不同,以满足不同用户的不同推荐需求为目的、不同人可以获得不同推荐为重要特征的个性化推荐系统应运而生.

如何使用ALS计算获得item相似度 How to get similar item recommendations using ALS - Quora

- -
不幸的是,Spark ML不支持使用Matrix Factorization模型的item 相似性推荐. Spark不使用Matrix Factorization模型计算item相似度的原因只是该技术不计算item相似性,也不计算用户相似性矩阵. (MF会计算出结果用户因素和项目因素,但不会在这里详细介绍它.

基于Item的时序协同过滤算法

- - 冰火岛
基于Item的时序协同过滤算法技术方案包括两个步骤:. (1)提取用户商品点击日志、搜索点击日志和商品基本信息等基本数据. 然后,去除噪音数据(譬如每天点击商品数达到数以万计的用户)和缺失值数据,构建时序点击流数据,即记录用户每天按照点击时间先后顺序排序的商品行为数据. 从而得到如下数据结构:<用户id,商品id,点击时间,点击日期>;.

为豆瓣电影实现User-based协同过滤的推荐系统

- - 鸟窝
协同过滤(Collaborative Filtering),简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐使用者感兴趣的信息,个人透过合作的机制给予信息相当程度的反馈(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,反馈不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要,比如浏览信息,收藏,分享,点击等.