推荐算法-基于协同推荐(CF)

写在前面

最近几天将之前学习的CF基于协同过滤推荐算法笔记整理了一下,。CB算法在上一篇文章中有做整理。
时光机:基于内容推荐算法-CB
有需要的同学可以点赞收藏一下

概念

基于协同是在基于内容的基础之上发展而来的,协同过滤是一种在推荐系统中广泛采用的推荐方法。这种算法基于一个“物以类聚,人以群分”的假设,喜欢相同物品的用户更有可能具有相同的兴趣。基于协同过滤的推荐系统一般应用于有用户评分的系统之中,通过分数去刻画用户对于物品的喜好。协同过滤被视为利用集体智慧的典范,不需要对项目进行特殊处理,而是通过用户建立物品与物品之间的联系。 目前,协同过滤推荐系统被分化为两种类型:基于用户(User-based)的推荐和基于物品(Item-based)的推荐。

分类

基于用户(User-based)的推荐

基于用户的协同过滤推荐的基本原理是,根据所有用户对物品或者信息偏好(评分),发现与当前用户口味和偏好相似的“邻居”用户群,在一般应用中是采用计算K近邻的算法;基于这 K个邻居的历史偏好信息,为当前用户进行推荐。 这种推荐系统的优点在于推荐物品之间在内容上可能完全不相关,因此可以发现用户的潜在兴趣,并且针对每个用户生成其个性化的推荐结果。缺点在于一般的Web系统中,用户的增长速度都远远大于物品的增长速度,因此其计算量的增长巨大,系统性能容易成为瓶颈。因此在业界中单纯的使用基于用户的协同过滤系统较少。

  • 假设
    • 用户喜欢那些跟他有相似爱好的用户喜欢的东西
    • 具有相似兴趣的用户在未来也具有相似兴趣
    • 比如张三喜欢篮球,李四也喜欢篮球;张三买了球鞋,那么李四喜欢球鞋的概率相对来说会更大
  • 方法
    • 用户张三,找到一个用户的集合N(张三),他们和张三具有相似的兴趣
    • 将N(张三)集合里的用户们喜欢的物品推荐给张三

下面我画个UI(user-item)矩阵加深大家的理解<以电影为例子,每个用户对电影的评分>

user\item鬼吹灯僵尸先生虎胆龙威泰坦尼克号僵尸道长
张三5122
李四15255
王五2354
赵四4353

由上面的UI(user-item)矩阵通过相似度计算可以得到UU(user-user)矩阵

user\user张三李四王五赵四
张三10.590.730.91
李四0.5910.970.77
王五0.730.9710.87
赵四0.910.770.871

我举个例子:张三跟李四的相似度计算
只统计双方有数据情况,可以得到向量
张三:(5,1,2,2)
李四:(1,5,5,5)
通过余弦相似度Cosine计算公式:在这里插入图片描述
将相乘的部分分开计算进行归一化处理:归一化请看后面解释

import math
# 计算分母:
zhangsan = math.sqrt(pow(5,2)+pow(1,2)+pow(2,2)+pow(2,2)) = 5.83
lisi = math.sqrt(pow(1,2)+pow(5,2)+pow(5,2)+pow(5,2)) = 8.72
# 得到新的向量
# 张三(5/5.83,1/5.83,2/5.83,2/5.83)
# 李四(1/8.72,5/8.72,5/8.72,5/8.72)

result = ((5/5.83)*(1/8.72))+((1/5.83)*(5/8.72))+((2/5.83)*(5/8.72))+((2/5.83)*(5/8.72)) = 0.59

所以根据以上两表能够大概预测出王五对僵尸先生的评分(兴趣):

result = (0.97 * 5 + 0.87 * 3 + 0.73 * 1) / (0.97 + 0.87 + 0.73) = 3.18

基于物品(Item-based)的推荐

基于物品的协同过滤和基于用户的协同过滤相似,它使用所有用户对物品或者信息的偏好(评分),发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户。 同基于用户的推荐相比,基于物品的推荐应用更为广泛扩展性和算法性能更好。由于项目的增长速度一般较为平缓,因此性能变化不大。缺点就是无法提供个性化的推荐结果。

  • 假设
    • 用户喜欢跟他以前喜欢的物品相似的物品
    • 历史上相似的物品在未来肯定也相似
  • 方法
    • 用户张三,找到他过去喜欢的物品的集合R(张三).
    • 把和R(张三)相似的物品推荐给张三

下面还是以上面的UI(user-item)矩阵来加深大家的理解<以电影为例子,每个用户对电影的评分>

user\item鬼吹灯僵尸先生虎胆龙威泰坦尼克号僵尸道长
张三5122
李四15255
王五2354
赵四4353

由上面的UI(user-item)矩阵通过相似度计算可以得到II(item-item)矩阵

user\item泰坦尼克号僵尸先生虎胆龙威鬼吹灯僵尸道长
泰坦尼克号10.570.990.690.63
僵尸先生0.5710.800.990.98
虎胆龙威0.990.8010.840.95
鬼吹灯0.690.990.8410.99
僵尸道长0.630.980.950.991

计算方式参照user-item,按照每列组合向量得到

所以根据以上两表能够大概预测出王五对僵尸先生的评分(兴趣):
c(2,3,5,4)

result = (0.57 * 2 + 0.80 * 3 + 0.99 * 5 + 0.98 * 4) / (0.57 + 0.80 + 0.99 + 0.98) = 3.72

结果不一样是因为两种算法基于的内容不一样,这只是粗排阶段,做到最大找回!要返回到用户层还需要做一次精排,重新计算分数排序。

归一化

将左右两边的公司以*号分割开
在这里插入图片描述
结合上面的示例可以理解一下这个归一化转换,目的是为了减小计算开销,将分母分开不用每次都扫一遍矩阵。

总结

User-BasedItem-Based
性能适合用户少的场景,若用户过多,计算用户相似度矩阵的代价太大适用于物品个数明显小于用户数的场合,若物品很多,计算物品相似度矩阵的代价太大
领域用户个性化需求不明显的领域物品丰富,用户个性化需求强烈的领域
实时性用户有新行为,不一定会立即造成推荐结果的变化用户有新行为,一定会导致推荐结果的变化
冷启动在用户对很少的物品产生行为时,不能立即对其进行推荐,因为用户相似度表是每隔一段时间进行离线计算。当新物品上线后一段时间内,一旦有用户对新物品产生行为,就可以将新物品推荐给与该用户有着同样兴趣爱好的其它用户新用户只要对一个物品产生行为,就可以 给他推荐和该物品相关的其他物品 但没有办法在不离线更新物品相似度表的 情况下将新物品推荐给用户
推荐理由很难提供令用户信服的推荐解释利用用户的历史行为给用户做推荐解释,可以令用户比较信服

冷启动

基于以上对比,说说冷启动的一些解决方案。冷启动大致可分位三类:

  • 用户冷启动

    • 提供热门排行榜,等用户数据收集到一定程度再切换到个性化推荐
    • 利用用户注册时提供的年龄、性别等数据做粗粒度的个性化
    • 利用用户社交网络账号,导入用户在社交网站上的好友信息,然后给用户推荐其好友喜欢的物品
    • 在用户新登录时要求其对一些物品进行反馈,收集这些兴趣信息,然后 给用户推荐相似的物品
  • 物品冷启动

    • UserCF和ItemCF都行不通,只能利用Content based解决该问题,频繁更新相关性 数据
    • 给新物品推荐给可能对它感兴趣的用户,利用内容信息,将他们推荐给喜欢过和它们 相似的物品的用户
    • 物品必须能够在第一时间展现给用户,否则经过一段事件后,物品的价值就大大降低了
  • 系统冷启动

    • 利用相关的模型迅速建立起物品的相关性矩阵
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值