0. 协同过滤算法简介
协同过滤(Collaborative Filtering),简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息。根据关注内容的不同,协同过滤算法分为三类:
以用户为基础(User-based)的协同过滤:用相似统计的方法得到具有相似爱好或者兴趣的相邻用户,使用与推荐用户相似用户的感兴趣的项目进行推荐。
以项目为基础(Item-based)的协同过滤:“能够引起用户兴趣的项目,必定与其之前评分高的项目相似”,透过计算项目之间的相似性来代替用户之间的相似性。
以模型为基础(Model-based)的协同过滤:用历史数据得到一个模型,再用此模型进行预测。
mllib中实现了以模型为基础的协同过滤,使用als算法训练模型。
1. 数据源
book-crossing dataset:
其中包含三个文件
评分数据文件:"User-ID";"ISBN";"Book-Rating"
图书数据文件:"ISBN";"Book-Title";"Book-Author";"Year-Of-Publication";"Publisher";"Image-URL-S";"Image-URL-M";"Image-URL-L"
用户数据文件:“User-ID”;"Location";"Age"
2. 数据预处理
MLlib的ALS算法实现有一个小缺点:它要求user和item的ID必须是数值型,并且是32位非负整数。评分文件中userid为int类型,而ISBN为string类型,需要将其先转换为 int类型。这里我们采用将BX-Books中的所有图书一一对应到从1开始的自增id,使用hashmap保存映射关系,而后将BX-Book-Ratings中的ISBN映射到自增id上。在对数据进行映射的过程中发现,评分集中有ISBN未在图书表中出现,将此类型条目删除构成新的评分文件。
public static void processing() throws IOException {
ArrayList books = new ArrayList<>();