推荐系统实战笔记2
推荐系统实践2
协同过滤:所有用户齐心协力,通过与网站的互动,不断过滤掉自己不感兴趣的物品
2.1 用户行为数据
- 显性反馈行为:评分和喜欢/不喜欢等直接表达喜好的行为
- 隐性反馈行为:如页面浏览等不能明确用户喜好的行为,一般分析用户会话日志得到该行为数据
2.2 用户行为分析
以用户购买过的物品数代表用户活跃度,以购买过该商品的用户数代表物品流行度
-
以物品流行度K为横坐标,以流行度为K的物品总数为纵坐标,该分布曲线呈长尾分布;
以用户活跃度K为横坐标,以活跃度为K的用户总数为纵坐标,该分布曲线呈长尾分布。
-
以用户活跃度K为横坐标,以具有某个活跃度的所有用户评过分的物品的平均流行度为纵坐标,该分布曲线呈长尾分布。(用户活跃度越高的用户,越倾向于购买流行度低的物品)
-
基于用户行为数据设计的算法即为协同过滤算法,有以下4种:
- 基于用户的协同过滤
- 基于物品的协同过滤
- 隐语义模型
- 基于图的随机游走算法
2.3 实验设计和算法评测
- 数据集:MoviesLens数据集,双重字典:
- 外层:key为用户id,value为该用户看过的电影id集合
- 内层:key为电影id,value为该用户对该电影的评分(此实验中令评分均为1)
- 实验设计:八折交叉验证
- 评价指标:
- 召回率,准确率
- 覆盖率
- 新颖度(以平均流行度衡量)
2.4 基于用户的协同过滤算法
一、算法实现
1.找到和目标用户兴趣相似的用户集合
2.找到该用户集合中用户喜欢的,且目标用户没有听说过的物品推荐给目标用户
给定用户u和v,令N(u)表示用户u曾经有过正反馈的物品集合,N(v)表示用户v曾经有过正反馈的物品集合
- 计算用户相似度矩阵:
-
余弦相似度
-
普通代码:双层遍历,遍历所有用户,两两计算相似度
-
改良代码:先建立item-user倒排表,再利用倒排表计算C[u] [v] (上述公式的分子),N[u] (上述公式的分母)
-
改进的余弦相似度:惩罚热门商品,users表示购买该商品的用户集合
-
计算公式:
-
代码实现:
- 给用户推荐与他兴趣相似的K个用户喜欢的物品
- 计算目标用户u对物品i的感兴趣程度(此处即在与用户u兴趣相似的K个用户中,选出买过物品i的用户,将他们与用户u的相似度相加):
- 代码实现:
二、算法缺点:
- 随着用户数增加,相似度矩阵越来越大,运算的时间复杂度和空间复杂度的增长与用户数量的增长呈平方关系
- 基于用户的协同过滤很难对推荐结果做出解释
2.5 基于物品的协同过滤算法
并不利用物品的内容属性计算相似度,而是通过用户的行为记录计算物品之间的相似度,即物品A和物品B具有很大相似度的原因是喜欢物品A的用户大都也喜欢物品B
一、算法实现
1.计算物品之间的相似度
2.根据物品之间的相似度和用户的历史行为给用户生成推荐列表
- 计算物品的相似度矩阵
-
普通版:
-
改进版:
-
计算公式:加大了对热门物品的惩罚(与余弦相似度的计算类似)
-
代码实现:
建立用户-物品倒排表(训练数据已经是倒排表),再计算相似度矩阵(第一段代码里面两层for循环应该遍历items而不是users)
-
超级版:加大了对活跃用户的惩罚
-
计算公式:
-
代码实现:
- 这种方法只是加大了对活跃用户的软性惩罚,实际应用中可以直接忽略他们
- 推荐物品给用户:
- 计算用户u对物品j的感兴趣程度:
- 计算公式(这里默认为1,公式可理解为用户对已购买的商品的评分与该商品与待推荐商品的相似度相乘再累加):
- 代码实现:
二、算法改进
- 一般来说,得到物品相似度矩阵w后,对其按行进行归一化,能够提高推荐的效果:
2.6 UserCF VS ItemCF
- UserCF给用户推荐那些与他兴趣爱好相似的用户喜欢的物品,侧重于反映和用户兴趣类似的小群体的热点,即推荐更加社会化
- ItemCF给用户推荐那些与他之前喜欢的物品类似的物品,侧重于反映用户自己的兴趣传承,即推荐更加个性化
- 具体使用哪种算法,还需结合具体场景,如用户/物品相似度矩阵维护的难易(大小、更新速度)
2.7 隐语义模型
- 此处使用的是隐性反馈数据集,只有正样本(用户喜欢什么物品),而没有负样本(用户对什么物品不感兴趣),因此应先进行负采样,同时遵循以下原则:
- 对于每个用户,正负样本要均衡
- 对于每个用户进行负采样时,要选取那些很热门,用户却没有行为的物品
- 代码如下:
items_pool是候选物品的列表,里面物品i出现次数与它的流行度成正比;
结果即为正样本取值为1,负样本取值为0
- 算法公式(书里出错):
-
LFM通过以下公式计算用户u对物品i的兴趣:
-
通过以下损失函数寻找参数p和q(含正则项):
-
通过梯度下降法逼近最佳参数:
-
超参数:
- 代码实现:
- 隐语义模型
-
推荐模型
结合下图理解:
- 算法缺点:
- 难以实现实时推荐:每次训练都需要扫描所有用户行为记录才能得到隐类向量p和q
2.8 基于图的模型
- 将用户行为数据表示为二分图后,个性化推荐算法即可转化为度量用户顶点和与没有边直接相连的物品节点在图上的相关性,相关性高的一对顶点一般具有如下特征:
1.两个顶点之间有很多路径相连
2.连接两个顶点之间的路径长度都比较短
3.连接两个顶点之间的路径不会经过出度比较大的顶点
- 基于随机游走的PersonalRank算法:
- 参考链接:https://blog.****.net/sinat_33741547/article/details/53002524
- 计算公式:
- 代码实现:
- 算法缺点与改良:
- 缺点:时间复杂度太高,不仅无法在线提供实时推荐,甚至离线生成推荐结果也很耗时
- 改良:
- 减少迭代次数
- 将PersonalRank转化为矩阵的形式