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

推荐算法CF

  • 写在前面
  • 概念
  • 分类
    • 基于用户(User-based)的推荐
    • 基于物品(Item-based)的推荐
    • 归一化
  • 总结
  • 冷启动

写在前面

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

概念

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

分类

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

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

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

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

user\item 鬼吹灯 僵尸先生 虎胆龙威 泰坦尼克号 僵尸道长
张三 5 1 2 2
李四 1 5 2 5 5
王五 2 3 5 4
赵四 4 3 5 3

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

user\user 张三 李四 王五 赵四
张三 1 0.59 0.73 0.91
李四 0.59 1 0.97 0.77
王五 0.73 0.97 1 0.87
赵四 0.91 0.77 0.87 1

我举个例子:张三跟李四的相似度计算
只统计双方有数据情况,可以得到向量
张三:(5,1,2,2)
李四:(1,5,5,5)
通过余弦相似度Cosine计算公式:推荐算法-基于协同推荐(CF)_第1张图片
将相乘的部分分开计算进行归一化处理:归一化请看后面解释

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 鬼吹灯 僵尸先生 虎胆龙威 泰坦尼克号 僵尸道长
张三 5 1 2 2
李四 1 5 2 5 5
王五 2 3 5 4
赵四 4 3 5 3

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

user\item 泰坦尼克号 僵尸先生 虎胆龙威 鬼吹灯 僵尸道长
泰坦尼克号 1 0.57 0.99 0.69 0.63
僵尸先生 0.57 1 0.80 0.99 0.98
虎胆龙威 0.99 0.80 1 0.84 0.95
鬼吹灯 0.69 0.99 0.84 1 0.99
僵尸道长 0.63 0.98 0.95 0.99 1

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

冷启动

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

  • 用户冷启动

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

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

    • 利用相关的模型迅速建立起物品的相关性矩阵

你可能感兴趣的:(推荐系统,大数据,算法,推荐系统,大数据)