最近,因为导师项目需要,花了几天时间学习了项亮的《推荐系统实践》,并用python实现了书上的Item Collaborative Filtering即基于物品的协同过滤算法,发现很多博客在算法的代码的实现上说得很笼统,而且项亮的书中关于协同过滤的代码实现写得又很零碎,故写此文总结。
什么是协同过滤
协同过滤是推荐系统中最经典和常用的算法,其核心思想就是它的名字:利用所有用户的历史行为数据,用户通过不断地和网站互动,使推荐列表能够不断过滤掉用户不感兴趣的物品,从而越来越满足需求。
协同过滤分为两大类:
- 基于用户的协同过滤(UserCF):当要给目标用户进行推荐时,先找出与他相似的其他用户,再从那些用户喜欢的项目中找出目标用户没有看过的项目推荐给他。
- 基于项目的协同过滤(ItemCF):先找出目标用户历史观看列表里与之相似的其他项目,再对这些相似项目进行排序并生成最后的推荐列表。
评分预测还是TopN推荐?
评分预测和TopN推荐是推荐系统两种衡量预测准确度的指标,大多数的推荐研究都是基于评分预测来展开的,主要是因为从事这方面早期研究的组织GroupLens主要就是针对电影评分进行的,而且Netflix等推荐算法的大赛也主要是在解决评分预测问题,然而,评分高就是好的推荐吗?当然不是,有时候用户给出好的评分并不代表他最想看它或者购买它。
部分代码实现
- 记载数据集并划分训练集与测试集
def get_dataset(self, filename, pivot=0.75):
trainSet_len = 0
testSet_len = 0
for line in self.load_file(filename):
user, movie, rating, timestamp = line.split(',')
if(random.random() < pivot):
self.trainSet.setdefault(user, {
})
self.trainSet[user][movie] = rating
trainSet_len += 1
else:
self.testSet.setdefault(user, {
})
self.testSet[user][movie] = rating
testSet_len += 1
print('划分训练集与测试集成功!')
print('训练集长 = %s' % trainSet_len)
print(