目录
0 推荐算法简介及评估
参考我的上一篇学习笔记:推荐系统--常见评估指标--学习笔记
1 协同过滤简介
协同过滤(Collaborative Filtering):是最经典、最常用的推荐算法,是推荐系统入门的算法。
所谓协同过滤, 基本思想是根据用户之前的喜好,以及其他兴趣相近的用户的选择,来给用户推荐物品。(基于对用户历史行为数据的挖掘发现用户的喜好偏向, 并预测用户可能喜好的产品进行推荐),一般是仅仅基于用户的行为数据(评价、购 买、下载等),而不依赖于项的任何附加信息(物品自身特征)或者用户的任何附加信息(年龄, 性别等)。目前应用:比较广泛的协同过滤算法是基于邻域的方法, 而这种方法主要有下面两种算法:
1. 基于用户的协同过滤算法(UserCF): 给用户推荐和他兴趣相似的其他用户喜欢的产品
2. 基于物品的协同过滤算法(ItemCF): 给用户推荐和他之前喜欢的物品相似的物品
PS. 不管是UserCF还是ItemCF算法, 非常重要的步骤之一就是计算用户和用户或者物品和物品之间的相似度。
所以下面先整理常用的相似性度量方法, 然后再对每个算法的具体细节进行展开。
2 几种相似性度量的方法
从向量的角度进行描述,令矩阵A为用户-商品交互矩阵(因为是TopN推荐并不需要用户对物品的评分,只需要知道
用户对商品是否有交互就行),即矩阵的每一行表示一个用户对所有商品的交互情况,有交互的商品值为1没有交互的
商品值为0,矩阵的列表示所有商品。若用户和商品数量分别为m,n的话,交互矩阵A就是一个m行n列的矩
阵。此时用户的相似度可以表示为(其中u·v指的是向量点积):
前面上述用户-商品交互矩阵在现实情况下是非常的稀疏了,为了避免存储这么大的稀疏矩阵,在计算用户相似度的时候一般会采用集合的方式进行计算。理论上向量之间的相似度计算公式都可以用来计算用户之间的相似度,但是会根据实际的情况选择不同的用户相似度度量方法。这个在具体实现的时候, 可以使用 cosine_similarity 进行python实现:
from sklearn.metrics.pairwise import cosine_similarity
i = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]
consine_similarity([a, b])
(3)皮尔逊相关系数
所以相比余弦相似度,皮尔逊相关系数通过使用用户的平均分对各独立评分进行修正,减小了用户评分偏置的影响。
具体也可以调包实现,皮尔逊相关系数python实现如下:
from scipy.stats import pearsonr
i = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]
pearsonr(i, j)
3 基于用户的协同过滤
1. 找到和目标用户兴趣相似的集合;
2. 找到这个集合中的用户喜欢的, 且目标用户没有听说过的物品推荐给目标用户。
|
上面的两个步骤中, 第一个步骤, 我们会基于前面给出的相似性度量的方法找出与目标用户兴趣相似的用户, 而第 二个步骤里面, 如何基于相似用户喜欢的物品来对目标用户进行推荐呢? 这个要依赖于目标用户对相似用户喜欢的物品 的一个喜好程度, 那么如何衡量这个程度大小呢? 为了更好理解上面的两个步骤, 下面拿一个具体的例子把两个步骤具
物品1 | 物品2 | 物品3 | 物品4 | 物品5 | |
Alice | 5 | 3 | 4 | 4 | ??? |
用户1 | 3 | 1 | 2 | 3 | 3 |
用户2 | 4 | 3 | 4 | 3 | 5 |
用户3 | 3 | 3 | 1 | 5 | 4 |
用户4 | 1 | 5 | 5 | 2 | 1 |
那么,在上表中,我们给用户推荐物品的过程可以形象化为一个猜测用户对商品进行打分的任务,上面表格里面是5个用户对于5件物品的一个打分情况,就可以理解为用户对物品的喜欢程度。应用UserCF算法的两个步骤:
1. 首先根据前面的这些打分情况(或者说已有的用户向量)计算一下Alice和用户1, 2, 3, 4的相似程度, 找出与Alice最相似的n个用户;
2. 根据这n个用户对物品5的评分情况和与Alice的相似程度会猜测出Alice对物品5的评分,
如果评分比较高的话, 就把物品5推荐给用户Alice, 否则不推荐。关于第一个步骤,
上面已经给出了计算两个用户相似性的方法, 这里不再过多赘述, 这里主要解决第二个问题, 如何产生最终结果的预测。
接下来,最终结果的预测------------------>
根据上面的几种方法, 我们可以计算出向量之间的相似程度, 也就是可以计算出Alice和其他用户的相近程度, 这时候我们就可以选出与Alice最相近的前n个用户, 基于他们对物品5的评价猜测出Alice的打分值, 那么是怎么计算的呢?这里常用的方式之一是利用用户相似度和相似用户的评价加权平均获得用户的评价预测, 用下面式子表示:
还有一种方式如下, 这种方式考虑的更加前面, 依然是用户相似度作为权值, 但后面不单纯的是其他用户对物品的评分, 而是该物品的评分与此用户的所有评分的差值进行加权平均, 这时候考虑到了有的用户内心的评分标准不一的情 况, 即有的用户喜欢打高分, 有的用户喜欢打低分的情况。
所以这一种计算方式更为推荐。下面的计算将使用这个方式。 在获得用户u对不同物品的评价预测后, 最终的推荐列表根据预测评分进行排序得到。
至此,基于用户的协同过滤算法 的推荐过程完成!!!
基于用户的协同过滤优缺点分析:
User-based算法存在两个重大问题:
1. 数据稀疏性。
一个大型的电子商务推荐系统一般有非常多的物品,用户可能买的其中不到1%的物品,不同用户之间买的物品重叠
性较低,导致算法无法找到一个用户的邻居,即偏好相似的用户。这导致UserCF不适用于那些正反馈获取较困难的 应用场景(如酒店预订, 大件商品购买等低频应用)
2. 算法扩展性。
基于用户的协同过滤需要维护用户相似度矩阵以便快速的找出Topn相似用户, 该矩阵的存储开销非常大,存储空间随着用户数量的增加而增加,不适合用户数据量大的情况使用。
由于UserCF技术上的两点缺陷, 导致很多电商平台并没有采用这种算法, 而是采用了ItemCF算法实现最初的推荐系统。
4 基于物品的协同过滤
1. 首先计算一下物品5和物品1, 2, 3, 4之间的相似性(它们也是向量的形式,
每一列的值就是它们的向量表示, 因为 ItemCF认为物品a和物品c具有很大的相似度是
因为喜欢物品a的用户大都喜欢物品c, 所以就可以基于每个用户对该物 品的打分或者说喜欢程度来向量化物品)
2. 找出与物品5最相近的n个物品
3. 根据Alice对最相近的n个物品的打分去计算对物品5的打分情况
5 协同过滤算法评估
(1)召回率
(2)准确率
(3)覆盖率 (该覆盖率表示最终的推荐列表中包含多大比例的物品。如果所有物品都被给推荐给至少一个用户, 那么覆盖率是100%)
(4)新颖度
6 协同过滤的权重改进
如上图:
(1)基础算法:图1为最简单的计算物品相关度的公式, 分子为同时喜好itemi和itemj的用户数。
(2)对热门物品的惩罚:图1存在一个问题, 如果 item-j 是很热门的商品,导致很多喜欢 item-i 的用户都喜欢 item-j,这时Wij就会非常大。 同样,几乎所有的物品都和 item-j 的相关度非常高,这显然是不合理的。所以图2中分母通过引入N(j)来对 item-j 的热度进行惩罚。如果物品很热门, 那么N(j)就会越大, 对应的权重就会变小。
(3)对热门物品的进一步惩罚:如果 item-j 极度热门,上面的算法还是不够的。举个例子,《Harry Potter》非常火,买任何一本书的人都会购买它,即使通过图2的方法对它进行了惩罚,但是《Harry Potter》仍然会获得很高的相似度。这就是推荐系统领域著名的 Harry Potter Problem。 如果需要进一步对热门物品惩罚,可以继续修改公式为如图3所示,通过调节参数 α, α越大,惩罚力度越大,热 门物品的相似度越低,整体结果的平均热门程度越低。
(4)对活跃用户的惩罚:同样的,Item-based CF 也需要考虑活跃用户(即一个活跃用户(专门做刷单)可能买了非常多的物品)的影响,活跃 用户对物品相似度的贡献应该小于不活跃用户。图4为集合了该权重的算法。