我的推荐算法之路(1):协同过滤
一、什么是协同过滤?
顾名思义,“协同过滤”就是协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的信息的推荐过程。其主要分为:
- 基于用户相似度进行推荐的协同过滤算法($UserCF$)
- 基于物品相似度进行推荐的协同过滤算法($ItemCF$)
二、基于用户相似度进行推荐的协同过滤算法($UserCF$)
2.1 UserCF流程
基于历史数据,构建以用户(假设用户总数为 $m$)为行坐标,物品(物品总数为 $n$)为列坐标的 $m×n$ 维的共现矩阵;
计算共现矩阵两两行向量间的相似性,构建 $m×m$ 维的用户相似度矩阵;
若要对用户 $K$ 进行推荐时,利用其 $Top$ $n$ 相似用户的已有评价对目标用户的偏好进行预测,生成最终推荐结果。
$$R_{u,p} = \frac{\sum_{s \in S}(w_{u,s}*R_{s,p})}{\sum_{s \in S}w_{u,s}}$$
其中,权重 $w_{u,s}$ 是用户 $u$ 和用户 $s$ 的相似度, $R_{s,p}$ 是用户 $s$ 对物品 $p$ 的评分。
由以上公式得到用户 $u$ 对物品的预测得分,进行排序即可得到最终的推荐列表。
2.2 存在的缺点
- 在互联网应用的场景下,用户数远大于物品数,而 $UserCF$ 需要维护用户相似度矩阵以便快速找出 $Top$ $n$ 相似用户。该用户相似度矩阵的存储开销非常大,而且随着业务的发展,用户数的增长会导致用户相似度矩阵的存储空间以 $n^2$ 的速度快速增长,这是在线存储系统难以承受的扩展速度。
- 用户的历史数据向量往往非常稀疏,对于只有几次购买或点击行为的用户来说,找到相似用户的准确度是非常低的,这导致 $UserCF$ 不适用于那些正反馈获取较困难的应用场景(如酒店预定、大件商品购买等低频应用)。
三、基于物品相似度进行推荐的协同过滤算法(ItemCF)
3.1 ItemCF流程
基于历史数据,构建以用户(假设用户总数为 $m$)为行坐标,物品(物品总数为 $n$)为列坐标的 $m×n$ 维的共现矩阵;
计算共现矩阵两两列向量间的相似性,构建 $n×n$ 维的用户相似度矩阵;
获得用户历史行为数据中的正反馈物品列表;
利用物品相似度矩阵,针对目标用户历史行为中的正反馈物品,找出相似的 $Top$ $k$ 个物品,组成相似物品集合;
对相似物品集合中的物品,利用相似度分值进行排序,生成最终的推荐列表,物品的相似度分值计算公式如下:
$$R_{u,p}=\sum_{h \in H} (R_{u,h}*w_{p,h})$$
其中,$H$ 是目标用户的正反馈物品集合,$w_{p,h}$ 是物品 $p$ 与物品 $h$ 的物品相似度,$R_{u,h}$ 是用户 $u$ 对物品 $h$ 的已有评分。
四、相似度计算
(1) 余弦相似度。余弦相似度衡量了用户向量 $i$ 和用户向量 $j$ 之间的向量夹角大小。显然,夹角越小,证明余弦相似度越大,两个用户越相似。
$$sim(\vec{i},\vec{j})=cos(\vec{i},\vec{j})=\frac{\vec{i}\cdot \vec{j}}{\mid \mid\vec{i}\mid\mid\cdot \mid \mid\vec{j}\mid\mid}$$
(2)皮尔逊相关系数。相比余弦相似度,皮尔逊相关系数通过使用用户平均分对各独立评分进行修正,减小了用户评分偏置的影响。
$$sim(i,j) = \frac{\sum_{p\in P}(R_{i,p}-\overline{R_i})(R_{j,p}-\overline{R_j})}{\sqrt{\sum_{p\in P}(R_{i,p}-\overline{R_i})^2}\sqrt{\sum_{p\in P}(R_{j,p}-\overline{R_j})^2}}$$
五、$UserCF$ 与 $ItemCF$ 的应用场景
- 一方面,由于 $UserCF$ 基于用户相似度进行推荐,使其具备更强的社交特性,用户能够快速得知与自己兴趣相似的人最近喜欢的是什么。这样的特点使其非常适用于新闻推荐场景。因为新闻本身的兴趣点往往是分散的,相比用户对不同新闻的兴趣偏好,新闻的及时性、热点性往往是其更重要的属性,而 $UserCF$ 正适用于发现热点,以及跟踪热点的趋势。
- 另一方面,$ItemCF$ 更适用于兴趣变化较为稳定的应用,比如在 $Amazon$ 的电商场景中,用户在一个时间段内更倾向于寻找一类商品,这时利用物品相似度为其推荐相关物品是契合用户动机的。
六、存在缺点及未来展望
- 热门的物品具有很强的头部效应,容易跟大量物品产生相似性;而尾部物品由于特征向量稀疏,很少与其他物品产生相似性,导致很少被推荐;
- 为解决上述问题,同时增加模型的泛化能力,矩阵分解技术被提出。该方法在共现矩阵的基础上,使用更稠密的隐向量表示用户和物品,挖掘用户和物品的隐含兴趣和特征,在一定程度上弥补了协同过滤模型处理稀疏矩阵能力不足的问题。
- 另外,协同过滤仅利用用户和物品的交互信息,无法有效地引入用户年龄、性别、商品描述、商品分类、当前时间等一系列用户特征、商品特征、上下文特征,造成了有效信息的遗漏;
- 为解决上述问题,推荐系统逐渐发展到以逻辑回归模型为核心、能够综合不同类型特征的机器学习模型的道路上。
七、代码实现
1 | # 数据集:MovieLens 1M |
1 | # UserCF.py |