推荐系统三十六式:近邻推荐 学习笔记

 

1.重点归纳

1)协同过滤算法分两类:

(1)基于记忆的协同过滤:就是记住每个用户消费过的物品,然后给他推荐相似的东西,或者推荐相似的人消费的东西。

(2)基于模型的协同过滤:从用户物品关系矩阵中学习一个模型,从而把矩阵空白处填满。

2)基于人的协同过滤的步骤

(1)准备用户向量,构造稀疏矩阵。

(2)用每个用户的向量,两两计算用户之间的相似度,设定一个相似度阈值或者设定一个最大数量,为每个用户保留与其最相似的用户。

(3)为每个用户产生推荐结果:把相似用户们喜欢过的物品汇总起来,去掉用户自己消费过的物品,剩下的排序输出推荐结果

用户u与物品i的匹配分数:

为用户u与用户j之间(用户u和j是相似用户)的相似度

Rj,i为用户j对物品i的评分

3)基于物品的协同过滤步骤

(1)构建用户物品的关系矩阵。矩阵元素是用户的消费行为,也可以是消费后的评价,还可以是对消费行为的某种量化如时间、次数、费用。

(2)假如矩阵的行为表示物品,列表示用户的话,行向量之间的两两计算相似度得到物品相似度矩阵(行和列都是物品)

(3)产生推荐结果。根据推荐场景不同,可以是为某个物品推荐相关的物品,也可以是在个人首页产生的类似“猜你喜欢”的推荐结果。

4)基于物品的协同过滤计算推荐结果

(1)Top K推荐,形式上属于类似“猜你喜欢”

  • 汇总和“用户已经消费过的物品相似”的物品,按照汇总后的分数从高到低推出
  • 用户u对物品i的分数:
    • 用户评分过的物品共m个
    • sim(i,j)为用户评分过的物品j与物品i的相似度
  • 不需要对所有物品都计算一遍,只需要按照用户评分过的物品,逐一取出来和它们相似的物品出来就可以

(2)相关推荐

  • 这类推荐不需要提前合并计算,当用户访问一个物品详情页面时/完成一个物品消费的结果页面,直接获取这个物品相似的物品推荐,就是“看了又看”或者“买了又买”的推荐结果

5)杰卡德相似度只适合布尔值向量,余弦相似度弹性略大适合两种向量。欧式距离度量是绝对值差异,余弦相似度的是方向的差异,但是调整的余弦相似度则可以避免这个弱点。

2.人以群分,你是什么人就看到什么世界

1)协同过滤

(1)通过基于内容的推荐阶段,我们有了可观的用户行为,这些行为可以表达成一个用户和物品的关系矩阵。

(2)协同过滤算法分类

  • 基于记忆的协同过滤:就是记住每个用户消费过的物品,然后给他推荐相似的东西,或者推荐相似的人消费的东西。
  • 基于模型的协同过滤:从用户物品关系矩阵中学习一个模型,从而把矩阵空白处填满。

2)基于用户的协同过滤

(1)根据历史消费行为帮你找到一群和你口味相似的用户,然后根据这些和你相似的用户再消费了新的,你没有见过的物品都可以推荐给你。

(2)步骤

一、准备用户向量,向量的特点:

  • 向量的维度就是物品的个数
  • 向量是稀疏的
  • 向量维度上 的取值可以是简单的0/1布尔值(1代表喜欢,0表示没有),因为是稀疏向量,取值0忽略

二、用每个用户的向量,两两计算用户之间的相似度,设定一个相似度阈值或者设定一个最大数量,为每个用户保留与其最相似的用户。

三、为每个用户产生推荐结果:把相似用户们喜欢过的物品汇总起来,去掉用户自己消费过的物品,剩下的排序输出推荐结果。

用户u与物品i的匹配分数:

为用户u与用户j之间(用户u和j是相似用户)的相似度。

Rj,i为用户j对物品i的评分。

3)构造矩阵

使用稀疏矩阵存储格式来构造矩阵,就可以使用常用的计算框架的标准输入。

  • CSR:这个存储方式稍微复杂点,是一个整体编码方式。它有三个组成:数值、列号和行偏移共同编码。
  • COO:这个存储方式稍微简单,每个元素用一个三元组表示(行号,列号,数值),只存储有值的元素,缺失值不存储。

4)相似度计算

(1)如果向量很长(物品很多),通常降低相似度计算复杂度的办法有两种:

  • 对向量采样计算。例如100维的向量随机取出10维向量来计算相似度,损失一些精度,但计算复杂度大幅度降低。
  • 向量化计算。把循环转换成向量来直接计算。

(2)如果用户量很大,缓解办法:

  • 将相似度拆成Map Reduce任务,将原始矩阵Map成键为用户对,值为两个用户对同一个物品的评分之积Reduce阶段对这些乘积再求和,Map Reduce任务结束后再对这些值归一化。
  • 不用基于用户的协同过滤。
  • 如果数据量不大(一般不超过百万),然后又是稀疏矩阵,单机版的工具更快,如KGraph、GraphCHI等工具。

5)计算推荐分数

(1)为用户计算每一个物品的推荐分数代价太大了,只有相似用户喜欢过的物品需要计算。

(2)把计算过程拆成Map Reduce任务

6)一些改进

(1)惩罚对热门物品的喜欢程度。用户可能是被煽动,或者是无聊点击,很难反应用户的真实兴趣。

(2)增加喜欢程度的时间衰减,一般使用一个指数函数,指数就是一个负数,值和喜欢行为发生时间间隔正相关即可。因为人的口味会改变。

7)应用场景

(1)基于用户的协同过滤输出

  • 相似的用户列表
  • 基于用户的推荐结果

不但可以推荐物品,还可以推荐用户,如“相似粉丝”、“和你口味相同的人”等功能。

(2)基于用户的协同过滤强调个人私隐场景,不受大V影响,更能反映真实的兴趣群体。

8)存在的问题

(1)用户数量往往比较大,计算比较吃力

(2)用户口味变化很快,兴趣迁移问题很难反应出来

(3)数据稀疏,用户和用户之间的共同消费行为很少

3.解密“看了又看”和“买了又买”

1)基于物品的协同过滤(item-Based)首先计算相似物品,然后再根据用户消费国、或者正在消费的物品为其推荐。相对于基于用户的协同过滤的好处:

(1)物品的数量往往小于用户的数量

(2)物品之间的相似度比较静态,它们变化的速度没有用户的口味变化快

(3)物品对应的消费者数量较大,更有利于计算相似度

2)基本步骤

(1)构建用户物品的关系矩阵。矩阵元素是用户的消费行为,也可以是消费后的评价,还可以是对消费行为的某种量化如时间、次数、费用。

(2)假如矩阵的行为表示物品,列表示用户的话,行向量之间的两两计算相似度得到物品相似度矩阵(行和列都是物品)

(3)产生推荐结果。根据推荐场景不同,可以是为某个物品推荐相关的物品,也可以是在个人首页产生的类似“猜你喜欢”的推荐结果。

3)计算物品相似度

(1)用户物品关系矩阵

  • 向量的维度是用户,总维度是总用户数
  • 向量的各个维度的取值是用户对物品的消费结果
    • 行为本身的布尔值
    • 消费行为量化如时间长短、次数多少、费用大小等
    • 评价分数
  • 是一个稀疏向量,没有消费过的就不用表示出来

(2)一般选择余弦相似度(也可以是其它相似度计算法)

  • 分母是两个物品向量的长度,求元素值的平方和再开方
  • 分子是两个向量的点积,相同位置的元素值相乘再求和
  • 向量中大部分都是0,求和时不用算,求点积时只用管两个物品的公共用户,只有少量几个乘积而已,计算量不会很大。

(3)物品相似度计算的改进

  • 物品中心化

先计算每个物品收到的评分的均值,然后把物品向量中的分数减去对应物品的均值。去掉物品中铁杆粉丝群体的非理性因素。

  • 用户中心化

先计算每个用户评分的均值,然后把他打过的所有分数都减去这个均值。每个人标准不一样,有的标准严苛,有的宽松,可以在一定程度上仅仅保留了偏好,去掉主观成分。

4)计算推荐结果

(1)Top K推荐,形式上属于类似“猜你喜欢”

  • 汇总和“用户已经消费过的物品相似”的物品,按照汇总后的分数从高到低推出
  • 用户u对物品i的分数:
    • 用户评分过的物品共m个
    • sim(i,j)为用户评分过的物品j与物品i的相似度
  • 不需要对所有物品都计算一遍,只需要按照用户评分过的物品,逐一取出来和它们相似的物品出来就可以

(2)相关推荐

  • 这类推荐不需要提前合并计算,当用户访问一个物品详情页面时/完成一个物品消费的结果页面,直接获取这个物品相似的物品推荐,就是“看了又看”或者“买了又买”的推荐结果

5)Slope One算法

(1)经典基于物品推荐,相似度矩阵计算无法实时更新,而且没有考虑相似度的置信度问题。

(2)Slope One算法专门针对评分矩阵,不适用于行为矩阵。算法计算的是物品之间的距离,相似度的反面。

(3)例子

         评分矩阵

        

         转换后物品距离矩阵,括号外为物品距离(评分差值),括号里面为共同用户数量,代表两个物品的知心程度。物品A与物品B的差距为同时对物品A和B评分差值的平均值,即((5-3)+(3-4))/2=0.5

        

         计算步骤

  • 物品A相对物品B的距离为0.5,根据用户3对物品B的评分(2分)预测其对物品A的评分:2+0.5=2.5
  • 物品A相对物品C的距离为3,根据用户3对物品C的评分(5分)预测其对物品A的评分:5+3=8
  • 计算加权平均值:(8*1 + 2.5*2)/(1+2)=4.33

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

1)推荐系统两大门派

(1)相似度门派

  • 近邻推荐的核心就是相似度计算的选择,由于近邻推荐没有采用最优化思路,所以效果通常取决于矩阵的量化方式和相似度的选择。
  • 潜在假设:如果两个物品相似,也就是距离很近,那么两个物品就很容易产生一样的动作。
  • 最常用的相似度是余弦相似度,另外还有欧氏距离、皮尔逊相关度、自适应的余弦相似度、局部敏感哈希等。

(2)机器学习门派

  • 如在逻辑回归/线性回归中,一边是特征向量,另一边是模型参数向量,两者的点积运算就可以看做是相似度计算,不过模型的参数是从数据中由优化算法自动总结出来的。

2)计算相似度的向量数值有两种

  • 实数值
  • 布尔值,0/1

3)欧氏距离

     (1)计算公式:

(2)欧式空间下度量距离的方法,欧氏距离是衡量两个点之间的距离,欧氏距离不适合布尔向量之间。

(3)通常相似度的独立结果希望是[-1,1]或[0,1]之间,所以欧氏距离无法直接使用,需要二次转化E(p,q)为p和q点的距离。

(4)欧氏距离度量的是空间两点的绝对距离,适用于分析用户能力模型之间的差异,如消费能力、贡献内容的能力等。

4)余弦相似度

(1)计算公式:

(2)度量两个向量之间的夹角,在度量文本相似度、用户相似度、物品相似度的时候较为常用。

(3)它与向量的长度无关,只要方向一致,都视为相似。例如用140字摘要了一篇5000字的博客内容,两者得到的文本向量可以认为方向一致,词频程度不同,但是余弦相似度任然认为他们是相似的。

(4)在协同过滤中,如果选择余弦相似度,某种程度上更加依赖两个物品的共同评价用户数,而不是用户给予的评分多少。

(5)余弦相似度对绝对值不敏感的问题

  • 例子,用户A对两部电影的评分分别为1和2分,用户B对同样两部电影评分是4和5分,余弦相似度认为两用户非常相似。实际上用户A明显不喜欢这两部电影。
  • 改进版:调整的余弦相似度

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

5)皮尔逊相关度

(1)实际上也是一种余弦相似度,不过先对向量做了中心化,向量p和q各自减去向量的均值后再计算余弦相似度。结果范围[-1,1],-1表示负相关,1表示正相关。

        

(2)由于皮尔逊相关度度量的是两个变量的变化趋势是否一致,所以不适合用作计算布尔值向量之间的相关度。布尔值向量只有有限的两个值,根本没有“变化趋势,高低起伏”的说法。

6)杰卡德(Jaccard)相似度

(1)是两个集合的交集个数在并集中所占的比例。由于集合非常适用于布尔向量表示,所以杰卡德相似度非常适用于布尔向量。

(2)计算方法:

  • 分子是两个布尔向量做点积计算,得到交集的元素个数
  • 分母就是两个布尔向量做或运算,再求元素和

7)余弦相似度适用于评分数据,杰卡德相似度适合用于隐式反馈数据,如收藏行为相似度计算。

例子:如何做社交网络好友相似度量?

  • 特征:帖子发布数量、月均发贴数量、平均帖子字数、头像、标签数据(是否大V、是否营销号、是否网红、职业等)、统计发文Top关键词向量及词频
  • 标签数据可计算杰卡德相似度
  • Top关键词可计算余弦相似度
  • 发布量、字数等可计算欧式距离
  • 最后再融合这几个相似度得到总的相似度

猜你喜欢

转载自blog.csdn.net/jliang3/article/details/85246168