基于用户的协同过滤算法

协同过滤算法

参考书本: 项亮, 推荐系统实践. 2012

基于邻域的算法

是推荐系统中最基本的算法,不仅在学术界得到深入研究,而且在业界得到了广泛应用。

基于用户的协同过滤算法

本质:根据用户之间兴趣相似性。

(1) 找到和目标用户兴趣相似的用户集合。
(2) 找到这个集合中的用户喜欢的,且目标用户没有听说过的物品推荐给目标用户。

给定用户 u 和用户 v ,令 N(u) 表示用户 u 曾经有过正反馈的物品集合,令 N(v)为用户 v 曾经有过正反馈的物品集合。那么,我们可以通过如下的 Jaccard 公式简单地计算 u 和 v 的兴趣相似度

$w_{uv}=\frac{|N(u)\cap N(v)|}{|N(u)\cup N(v)|}$

或者通过余弦相似度

$w_{uv}=\frac{|N(u)\cap N(v)|}{\sqrt {|N(u)|| N(v)|}}$

but,利用余弦相似度时间复杂度较高,且很多用户没有相似点,即分子为0,因此可以先计算出分子不为0的用户。

因此可先建立关于物品到用户的倒排表,得到对物品产生过行为的用户列表。令稀疏矩阵C[u][v]=|N(u)$\cap$N(v)|。假设用户u,v同时属于倒排表中K个物品的用户列表,则有C[u][v]=C[v][u]=K。最后得到用户之间不为0的C[u][v]。得到的矩阵为余弦相似度中的分子。

最后可以得到用户之间的兴趣相似度。

得到用户之间的兴趣相似度后, UserCF 算法会给用户推荐和他兴趣最相似的 K 个用户喜欢的物品。

以下公式度量了用户u对物体i的感兴趣程度。

$p(u,i)=\sum_{v\in S(u,K)\cap N(i)}w_{uv}r_{vi}$

S包含与u兴趣最先进的K个用户。N(i)表示对物品i有过行为的用户集合。$w_{uv}$表示u与v的兴趣相似度。$r_{vi}$表示用户v对物品i的兴趣程度,这里因为是单一行为所以取1。

这里意思即是,求用户u对物品i的感兴趣程度:

对与用户u最相似的K个用户

1.对每一个用户v,得到uv相似度与v对物品感兴趣程度的积。

2.把k个用户的这个值加起来。

性能

性能参数:准确率 召回率 覆盖度 流行度

性能评估:
Random 算法每次都随机挑选 10 个用户没有产生过行为的物品推荐给当前用户, MostPopular 算法则按照物品的流行度给用户推荐他没有产生过行为的物品中最热门的 10 个物品。

这两种算法都是非个性化的推荐算法,但它们代表了两个极端。如表 2-5 所示, MostPopular 算法的准确率和召回率远远高于 Random 算法,但它的覆盖率非常低,结果都非常热门。可见, Random 算法的准确率和召回率很低,但覆盖度很高,结果平均流行度很低。

指标分析:

 准确率和召回率 可以看到,推荐系统的精度指标(准确率和召回率)并不和参数 K 成线性关系。在 MovieLens 数据集中,选择 K=80 左右会获得比较高的准确率和召回率。因此选择合适的 K 对于获得高的推荐系统精度比较重要。当然,推荐结果的精度对 K 也不是特别敏感,只要选在一定的区域内,就可以获得不错的精度。
 流行度 可以看到,在 3 个数据集上 K 越大则 UserCF 推荐结果就越热门。这是因为 K 决定了 UserCF 在给你做推荐时参考多少和你兴趣相似的其他用户的兴趣,那么如果 K 越大,参考的人越多,结果就越来越趋近于全局热门的物品。
 覆盖率 可以看到,在 3 个数据集上, K 越大则 UserCF 推荐结果的覆盖率越低。覆盖率的降低是因为流行度的增加,随着流行度增加, UserCF 越来越倾向于推荐热门的物品,从而对长尾物品的推荐越来越少,因此造成了覆盖率的降低。

改进

两个用户对冷门物品采取过同样的行为更能说明他们兴趣的相似度。

添加惩罚后的公式:

$w_{uv}=\frac{\sum_{i\in N(u)\cap N(v)}\frac{1}{\log 1+|N(i)}}{\sqrt {|N(u)|| N(v)|}}$