推荐系统-协同过滤

协同过滤

协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息。

分类

  1. 基于记忆的协同过滤;
    基于这个用户消费过的东西,向他推荐相似的东西,或者向他推荐相似的人消费的东西。
  2. 基于模型的协同过滤;
    从用户物品关系矩阵中学习模型,预测用户喜好。

基于用户的协同过滤

原理

  1. 准备用户向量(需要用户在产品中有行为数据);
    向量的维度是物品个数。
    向量是稀疏的。
    向量维度的取值为布尔值。
  2. 用每一个用户的向量,两两计算用户之间的相似度,设定阈值,为用户保留与其最相似的用户。
  3. 为每个用户产生推荐结果;

P表示计算物品i和用户u的匹配分数,右侧坟墓是累加和用户u相似的n个用户,分子是n个用户对物品i的态度与对应的相似度加权求和。

实践

构造矩阵

  1. CSR:整体编码方式。由三个组成:数值、列号与行偏移共同编码;
  2. COO:每个元素用一个三元组表示(行号、列号、数值),只存储有值的元素,缺失值不存储。

降低相似度计算复杂度

  1. 对向量采样计算;
  2. 向量化计算,想办法将循环转换成向量直接计算;

降低用户之间的计算代价

  1. 将相似度计算拆成Map Reduce任务,将原始矩阵Map成键为用户对,值为两个用户对同一个物品的评分之积,Reduce阶段对乘积求和,MapReduce任务结束后再对值归一化;
  2. 使用基于物品的协同过滤;

改进

  1. 惩罚对热门物品的喜欢程度,因为热门的东西很难反映出用户的真实兴趣;
  2. 对喜欢程度使用时间衰减函数,可以理解为人的口味不会保持一成不变;

应用场景

基于用户的协同过滤有两个产出:

  1. 相似用户列表;
  2. 基于用户的推荐结果;

P表示计算物品i和用户u的匹配分数,右侧坟墓是累加和用户u相似的n个用户,分子是n个用户对物品i的态度与对应的相似度加权求和。

基于物品的协同过滤

原理

基于用户的协同过滤的问题

  1. 用户数量比较大,计算耗时;
  2. 用户的兴趣点不是静态的,很难解决兴趣迁移问题;
  3. 数据稀疏,当用户量比较大的时候,用户之间的共有消费行为比较少,很难有相近的兴趣点;

基于物品的协同过滤

  1. 物品数量通常比较固定且远小于用户数量,计算时间不会成为瓶颈;
  2. 物品之间的相似度比较静态,与用户的兴趣迁移无关;
  3. 物品对应的消费者数量较大,对于计算物品之间的相似度稀疏度好过计算用户之间的相似度;

步骤

  1. 基于用户的消费行为,构建用户物品的关系矩阵;
  2. 计算物品之间的相似度矩阵,行和列都是物品;
  3. 产生推荐结果,可以为某个物品推荐相关物品,也可以为用户推荐物品;

相似度计算方法

余弦相似度,公式如下。

改进方法

  1. 物品中心化,为了去掉物品中粉丝群体的非理性因素;
  2. 用户中心化,去掉用户打分的主观成分;

应用场景

TopK推荐

类似于“猜你喜欢”,与基于用户的推荐算法一样,用相似度加权汇总。

左侧为用户u对物品i的分数预测,右侧分子为物品i与其他物品的相似度与用户的评分乘积再求和,分母为物品的相似度总和。TopK推荐可以离线完成,去掉用户已经消费过的,保留分数最高的k个结果存储。当用户访问首页时,直接查询即可。

相关推荐

类似于“看了又看,买了又买”。

Slope One算法

经典的基于物品的推荐,相似度矩阵计算无法实时更新,整个过程都是离线的,同时相似度计算时没有考虑相似度的置信问题。

Slope One算法计算的不是物品之间的相似度,而是计算的物品之间的距离。

协同过滤的相似度计算方法

相似度概念

在推荐算法中,如果两个物体很相似,那么这两个物体就很容易产生一样的动作。

欧氏距离

定义

欧氏空间下度量距离的方法,假设两个物体的坐标分别为p与q,那么欧氏距离就是衡量这两个点之间的距离。需要说明的是,欧式距离不适合衡量布尔向量之间距离

计算方式

因为欧氏距离得到的值是一个0到正无穷的范围,通常需要经过二次转化才能用于相似度计算度量。

这样可以将欧氏距离转换为0到1的相似度。欧式距离度量的是空间中两个点的绝对差异,适用于分析用户能力模型之间的差异,比如消费能力,贡献内容的能力等。

余弦相似度

定义

余弦相似度度量用两个向量的夹角的余弦值度量,当两个向量夹角为0度、90度、180度时,余弦值分别为1、0、-1。

余弦相似度在度量文本相似度、用户相似度、物品相似度时较为常用,但余弦相似度与向量长度无关,这是因为余弦相似度计算需要对向量长度做归一化。

计算方式

余弦相似度的背后的逻辑为:两个向量,如果方向一致,不管程度大小,都可以视为相似。

在协同过滤中,如果选择余弦相似度,某种程度上更加依赖两个物品的共同评价用户数,而不是用户的评分,这是因为余弦相似度被向量长度归一化后的结果。

调整的余弦相似度

先计算向量每个维度的均值,之后每个向量在各个维度上都减去均值,之后计算余弦相似度。

皮尔逊相关度

定义

可以把皮尔逊相关度理解为对向量做了中心化的余弦相似度,向量p与q各自减去向量的均值后,再计算余弦相似度。

公式

皮尔逊相关度计算结果范围在-1到1。-1表示负相关,1表示正相关。皮尔逊相关度度量的是两个变量的变化趋势是否一致,所以不适合用作计算布尔值向量之间的相似度。

Jaccard相似度

定义

Jaccard相似度表示两个集合的交集元素个数在并集中所占的比例。通常使用Jaccard相似度基于隐式反馈数据来计算用户的相似度,计算方式:

  1. 分子是两个布尔向量做点积计算,得到的是交集元素个数;
  2. 分母是两个布尔向量做或运算,得到元素和;

公式


   转载规则


《推荐系统-协同过滤》 Severus 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
复杂度分析为什么需要复杂度分析如果单纯的把代码跑一边,通过统计、监控的方式得到算法执行的时间和占用的内存大小,这种方法通常叫做事后统计法。事后统计法的局限性在于 测试结果非常依赖测试环境; 测试结果受数据规模的影响很大; 我们需要一个不
2021-03-08 Severus
下一篇 
leetcode习题笔记1 leetcode习题笔记1
1.两数之和题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 暴力枚举思路 枚举数组
2020-10-11 Severus
  目录