协同过滤
协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息。
分类
- 基于记忆的协同过滤;
基于这个用户消费过的东西,向他推荐相似的东西,或者向他推荐相似的人消费的东西。 - 基于模型的协同过滤;
从用户物品关系矩阵中学习模型,预测用户喜好。
基于用户的协同过滤
原理
- 准备用户向量(需要用户在产品中有行为数据);
向量的维度是物品个数。
向量是稀疏的。
向量维度的取值为布尔值。 - 用每一个用户的向量,两两计算用户之间的相似度,设定阈值,为用户保留与其最相似的用户。
- 为每个用户产生推荐结果;
P表示计算物品i和用户u的匹配分数,右侧坟墓是累加和用户u相似的n个用户,分子是n个用户对物品i的态度与对应的相似度加权求和。
实践
构造矩阵
- CSR:整体编码方式。由三个组成:数值、列号与行偏移共同编码;
- COO:每个元素用一个三元组表示(行号、列号、数值),只存储有值的元素,缺失值不存储。
降低相似度计算复杂度
- 对向量采样计算;
- 向量化计算,想办法将循环转换成向量直接计算;
降低用户之间的计算代价
- 将相似度计算拆成Map Reduce任务,将原始矩阵Map成键为用户对,值为两个用户对同一个物品的评分之积,Reduce阶段对乘积求和,MapReduce任务结束后再对值归一化;
- 使用基于物品的协同过滤;
改进
- 惩罚对热门物品的喜欢程度,因为热门的东西很难反映出用户的真实兴趣;
- 对喜欢程度使用时间衰减函数,可以理解为人的口味不会保持一成不变;
应用场景
基于用户的协同过滤有两个产出:
- 相似用户列表;
- 基于用户的推荐结果;
P表示计算物品i和用户u的匹配分数,右侧坟墓是累加和用户u相似的n个用户,分子是n个用户对物品i的态度与对应的相似度加权求和。
基于物品的协同过滤
原理
基于用户的协同过滤的问题
- 用户数量比较大,计算耗时;
- 用户的兴趣点不是静态的,很难解决兴趣迁移问题;
- 数据稀疏,当用户量比较大的时候,用户之间的共有消费行为比较少,很难有相近的兴趣点;
基于物品的协同过滤
- 物品数量通常比较固定且远小于用户数量,计算时间不会成为瓶颈;
- 物品之间的相似度比较静态,与用户的兴趣迁移无关;
- 物品对应的消费者数量较大,对于计算物品之间的相似度稀疏度好过计算用户之间的相似度;
步骤
- 基于用户的消费行为,构建用户物品的关系矩阵;
- 计算物品之间的相似度矩阵,行和列都是物品;
- 产生推荐结果,可以为某个物品推荐相关物品,也可以为用户推荐物品;
相似度计算方法
余弦相似度,公式如下。
改进方法
- 物品中心化,为了去掉物品中粉丝群体的非理性因素;
- 用户中心化,去掉用户打分的主观成分;
应用场景
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相似度基于隐式反馈数据来计算用户的相似度,计算方式:
- 分子是两个布尔向量做点积计算,得到的是交集元素个数;
- 分母是两个布尔向量做或运算,得到元素和;