一、算法思想
在上篇文章中简单实现了基于用户的协同过滤算法(userCF),该算法存在一些缺点:
- 随着用户数量的增加,计算用户相似度矩阵的时间和空间复杂度增长接近 O ( N 2 ) O(N^2) O(N2);
- 相比基于物品的协同过滤算法,基于用户的协同过滤算法可解释性稍弱(很难让用户相信:给用户推荐某个商品,原因是有个和该用户兴趣很相似的用户也买了这个商品。用户可能会有疑问:你凭什么说他和我的兴趣很相似)
基于物品的协同过滤算法(itemCF)的思想是给用户推荐 和用户喜欢的商品相似的商品,这就涉及到如何计算两个商品的相似度了。itemCF 中并不是利用物品本身的内容属性来计算相似度(这是基于内容的推荐),而是通过分析用户行为记录(评分、购买、点击、浏览等行为)来计算两个物品的相似度,同时喜欢物品A和物品B的用户数越多,就认为物品A和物品B越相似。下面介绍该算法的实现过程。
二、实现思路
- 数据集
本实现使用的数据集也是 MovieLens 提供的数据:

下载地址:MovieLens数据集
加载解压后为:

我们使用 ml-latest-small 文件夹下的 ratings.csv 文件:

该数据集中的数据格式为:

userId : 用户 ID
movieId : 用户看过的电影 ID
rating : 用户对所看电影的评分
timestap : 用户看电影的时间戳
- 定义变量
N : 记录电影被多少用户看过,如: N[“1”] = 10 表示有10个用户看过ID 为 “1”的电影;
W : 相似矩阵,存储两个用户的相似度,如:W[“1”][“2”] = 0.66 表示ID 为 “1” 的电影和 ID 为 “2” 的电影相似度为 0.66 ;
train : 用户记录数据集中的数据, 格式为: train= { user : [[item1, rating1], [item2, rating2], …], …… }
k : 使用最相似的 k 个电影
n : 为用户推荐 n 部电影
- 加载数据
从数据集中读出数据,将数据以 { user : [[item1, rating1], [item2, rating2], …],……} 的形式存入 train 中。 - 计算物品相似矩阵
本实现中物品相似度的计算公式为:
W i j = N ( i ) ⋂ N ( j ) N ( i ) ∗ N ( j ) W_{ij}=\frac{N(i)\bigcap N(j)}{\sqrt{N(i)*N(j)}} Wij=N(i)∗N(j)N(i)

本文详细介绍了基于物品的协同过滤算法(itemCF)的原理和实现过程。首先,阐述了itemCF相较于用户CF的优点和缺点,然后通过分析用户行为数据计算物品之间的相似度,并给出具体的数据处理和相似度计算步骤。接着,展示了源代码实现,包括数据加载、相似度计算和推荐算法。最后,给出了代码运行结果。
667

被折叠的 条评论
为什么被折叠?



