0
0

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

鸟窝 发表于 2016年03月28日 10:23 | Hits: 2071
Tag: 推荐系统 | 协同过滤,mahout | 大数据

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

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

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

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

123456789101112
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 行使用多线程批处理的方式,把计算结果写入到一个文件中。
生成的文件如下:

12345678910
......25821461,26253733,0.827928841114044225821461,26252196,0.81975603103637725821461,26366634,0.818181812763214125821461,25919385,0.703308224678039625821585,26328118,0.79471939802169825821585,22556810,0.765531837940216125821585,1972724,0.677092492580413825821585,25809260,0.6347297430038452......

电影 25821461 (旅程终点) 的信息如下:

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

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

代码下载:github

转载请注明文章来源: colobu.com

原文链接: http://colobu.com/2015/12/03/item-based-recommender-for-douban-movies/

0     0

评价列表(0)