前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >推荐系统学习笔记(1)-协同过滤-理论篇

推荐系统学习笔记(1)-协同过滤-理论篇

原创
作者头像
Johns
修改2022-06-30 10:25:30
2.1K02
代码可运行
修改2022-06-30 10:25:30
举报
文章被收录于专栏:代码工具
运行总次数:2
代码可运行

此博客为本人学习笔记, 主要是通过学习王喆老师的《深度学习推荐系统》极客课程时所做的一些笔记 同时参考了文章https://zhongqiang.blog.csdn.net/article/details/107891787 bilibili课程

1. 前言

在介绍协同过滤算法前我们需要先说一下推荐系统推荐系统解决的问题是什么?

1.1 推荐系统主要解决的问题是什么?

随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战:

  • 信息消费者:如何从大量的信息中找到自己感兴趣的信息?
  • 信息生产者:如何让自己生产的信息脱颖而出, 受到更多用户的关注?

推荐系统解决的问题就是, 在“信息过载”的情况下,用户如何高效获取感兴趣的信息。

一方面要帮助信息消费者发现对自己有价值的信息,一方面要让信息生产者的生产的信息能够展现在对它感兴趣的用户前面。

1.2 推荐系统的逻辑架构

从推荐系统的根本问题出发,我们可以清楚地知道,推荐系统要处理的其实是“”和“信息”之间的关系问题。也就是基于“”和“信息”,构建出一个找寻感兴趣“信息”的方法。 所以我们抽象出了问题中的非常重要的3个关键项:

(1) 物品信息(Item)

“信息”在不同场景下的具体含义也千差万别。比如说,在商品推荐中指的是“商品信息”,在视频推荐中指的是“视频信息”,在新闻推荐中指的是“新闻信息”,为了方便,我们可以把它们统称为“物品信息”。

(2) 用户信息(User)

从“人”的角度出发,为了更可靠地推测出“人”的兴趣点,推荐系统希望能利用大量与“人”相关的信息,这类信息包括历史行为、人口属性、关系网络等,它们可以被统称为“用户信息”。

(3) 上下文信息(Context)

在具体的推荐场景中,用户的最终选择一般会受时间、地点、用户的状态等一系列环境信息的影响,这些环境信息又可以被称为“场景信息”或“上下文信息”。

基于抽象出的3个关键项我们定义出了推荐系统的逻辑架构, 如下图

image.png
image.png

所以用一句话来说, 推荐系统要做的事情就是定义一个“函数”, 这个函数可以表达出什么样的人,在什么场景下对什么物品感兴趣, 而定义函数的方法我们一般称之为“推荐算法”

2 协同过滤算法

协同过滤(Collaborative Filtering)算法是一种经典的“推荐算法”, 基本思想是根据用户之前的喜好以及其他兴趣相近的用户的选择 来给用户推荐物品(基于对用户历史行为数据的挖掘发现用户的喜好偏向, 并预测用户可能喜好的产品进行推荐), 一般是仅仅基于用户的行为数据(评价、购买、下载等), 而不依赖于项的任何附加信息(物品自身特征)或者用户的任何附加信息(年龄, 性别等)。目前应用比较广泛的协同过滤算法是基于邻域的方法, 而这种方法主要有 下面两种算法:

  • 基于用户的协同过滤算法(UserCF): 给用户推荐和他兴趣相似的其他用户喜欢的产品。
  • 基于物品的协同过滤算法(ItemCF): 给用户推荐和他之前喜欢的物品相似的物品。

2.1 基于用户的协同过滤(UserCF)

基于用户的协同过滤(UserCF)可以追溯到1993年, 可以说是非常早的一种算法了, 这种算法的思想其实比较简单, 当一个用户A需要个性化推荐的时候, 我们可以先找到和她有相似兴趣的其他用户, 然后把那些用户喜欢的, 而用户A没有听说过的物品推荐给A。

image.png
image.png

基于用户的协同过滤算法主要包括两个步骤:

  1. 找到和目标用户兴趣相似的集合, 也就是计算每个用户之间的相似度。
  2. 找到这个集合中的用户喜欢的, 且目标用户没有听说过的物品推荐给用户。

2.2 基于物品的协同过滤算法(ItemCF)

基于物品的协同过滤(ItemCF)的基本思想是预先根据所有用户的历史偏好数据计算物品之间的相似性,然后把与用户喜欢的物品相类似的物品推荐给用户。比如物品a和c非常相似,因为喜欢a的用户同时也喜欢c,而用户A喜欢a,所以把c推荐给用户A。ItemCF算法并不利用物品的内容属性计算物品之间的相似度, 主要通过分析用户的行为记录计算物品之间的相似度, 该算法认为, 物品a和物品c具有很大的相似度是因为喜欢物品a的用户大都喜欢物品c。

image.png
image.png

基于物品的协同过滤算法主要分为两步:

  1. 计算物品之间的相似度。
  2. 根据物品的相似度和用户的历史行为给用户生成推荐列表(购买了该商品的用户也经常购买的其他商品)。

2.3 常见的相似度计算的方法

相似度就是比较两个事物的相似性。一般通过计算事物的特征之间的距离,如果距离小,那么相似度大;如果距离大,那么相似度小。

这里举例说明一下集中常见的相似度计算方法:

  • 闵可夫斯基距离(Minkowski Distance) 定义为:
    image.png
    image.png
  • 曼哈顿距离(Manhattan Distance)# p=1时,闵可夫斯基距离就是曼哈顿距离。 又称城市街区距离,在方正的北京大街打车,行车距离就是曼哈顿距离,如果在山城重庆就不是了。
  • 欧氏距离(Euclidean Distance)# p=2时,闵可夫斯基距离就是欧氏距离。 在平面几何或者立体几何中的距离,通常就是欧氏距离,所以欧氏距离也最容易理解。
  • 余弦相似度(Cosine Similarity) 给定两个属性向量, A 和B,其余弦相似性θ由点积和向量长度给出,如下所示:
    image.png
    image.png
    余弦相似度在高维情况仍然保持“相同时为1,正交时为0,相反时-1”的性质,而欧式距离的数值则受维度的影响,范围不固定,并且含义也比较模糊。不过,向量的模长归一化了之后,就成了皮尔逊相关系数了,这时候欧式距离与余弦相似度就有着单调关系了。
  • 皮尔逊相关系数(Pearson Correlation) Pearson相关系数是用协方差除以两个变量的标准差得到的,相比余弦相似度, 皮尔逊相关系数通过使用用户平均分对个独立评分进行修正, 减少了用户评分偏置的影响。公式如下:
image.png
image.png

一般情况下, 我们都是需要对数据进行归一化处理, 以消除指标之间的量纲影响, 所以大部分协同过滤大部分场景

我们只需要使用欧式距离或者余弦相似度就行。

使用时只要知道欧式距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异便可。具体问题需要具体分析,举例来说

(1) 如果要统计两部剧的用户观看行为,用户A的观看向量(0,1), 用户B为(1,0), 此时二者的余弦距离很大,而欧式距离很小。我们分析两个用户对于不同视频的偏好,更关注相对差异,显然应当用余弦距离。

(2)当我们分析用户活跃度,以登录次数和平均观看时长作为特征时, 余弦距离会认为(1,10)和(10,100)两个用户距离很近,但显然这两个用户活跃度是有着极大差异的。此时我们关注的是数值绝对差异,应当使用欧式距离。

2.4 协同过滤算法的对比

UserCF

ItemCF

性能

适用于用户较少的场合,如果用户很多,计算用户相似度矩阵代价很大

适用于物品数明显小于用户数的场合,如果物品很多,物品相似度矩阵会非常巨大

适用领域

适用于时效性较强,用户个性化兴趣不太明显的领域

适用于长尾物品丰富,用户个性化比较强烈的领域

实时性

用户有新行为,不一定会造成推荐结果的变化

用户有新行为,一定会导致推荐结果的变化

冷启动

在新用户对很少的物品产生行为后,不能立即对他进行个性化推荐,因为用户相似度表是每隔一段时间离线计算的新用户只要对一个物品产生行为,就可以给他推荐和该物品相关的其他物品

新物品上线后一段时间,一旦有用户对物品产生行为,就可以将新物品推荐给和对它产生行为的用户兴趣相似的其他用户但没有办法在不离线更新物品相似度表的情况下将新物品推荐给用户

推荐理由

很难提供令用户信服的推荐解释

利用用户的历史行为给用户做推荐解释,可以令用户比较信服

3. 举例说明

image.png
image.png

如果想知道Alice对物品5打多少分?

3.1 基于物品的协同过滤算法实现

第1步: 计算物品5与其他物品的的相似性度, 这里我们使用皮尔逊相关系数进行比较, 这样就不用归一化了

使用numpy可以很容易地把相似度矩阵算出来

代码语言:python
代码运行次数:2
复制
import numpy as np
import pandas as pd

# items[i] 对应物品i+1, 其中i=0,1,2,3, 4
items = np.array([
    [3, 4, 3, 1],
    [1, 3, 3, 5],
    [2, 4, 1, 5],
    [3, 3, 5, 2],
    [3, 5, 4, 1]]
)
cols = ['item' + str(idx) for idx in range(1, 6)]
pd.DataFrame(data=np.corrcoef(items), columns=cols, index=cols)
image.png
image.png
第2步: 找出与物品5最相近的n个物品, 这里的物品比较少, 所以就假设n=2.

通过第一步计算的相似度矩阵我们可以发现物品5和物品1, 4 比较相似

第3步: 根据Alice对最相近的n个物品的打分去计算对物品5的打分情况

一般我们会利用用户相似度和相似用户的评价加权平均获得用户的评价预测, 也就是公式:

image.png
image.png

但是不同的人对物品的评价偏好不一样, 有的人喜欢给高分,有的人喜欢给低分。对于这种有明显用户评分偏的情况, 我们需要物品的评分与此用户的所有评分的差值进行加权平均的方式来消除掉, 也就是公式:

image.png
image.png

物品5和物品1, 4的相似度为0.97和0.58, 物品1, 4的平均评分为16/5=3.2和17/5=3.4, 物品5的平均评分为13/4=3.25

代入公式可以计算出:

image.png
image.png

3.2 基于用户的协同过滤算法实现

第1步: 计算用户5和其他用户的皮尔逊相关系数
代码语言:python
代码运行次数:0
复制
import numpy as np
import pandas as pd

# items[i] 对应物品i+1, 其中i=0,1,2,3, 4
users = np.array([
    [3, 1, 2, 3,],
    [4, 3, 4, 3,],
    [3, 3, 1, 5,],
    [1, 5, 5, 2,],
    [5, 3, 4, 4]]
)
cols = ['user' + str(idx) for idx in range(1, 6)]
pd.DataFrame(data=np.corrcoef(users), columns=cols, index=cols)
image.png
image.png
第2步: 找出与用户5最相近的n个用户, 这里也假设n=2

最近的2个用户是用户1,2, 他们给物品5的打分是3分和5分

第3步: 根据Alice对最相近的n个用户的打分去计算对物品5的打分情况

用户5和用户1, 2的相似度为0.85和0.71, 用户1, 2的平均评分为12/5=2.4和19/5=3.8, 用户5的平均评分为16/4=4

代入公式就可以得出Alice可能给的评分为

image.png
image.png

4. 总结

这篇文章的主要分析和介绍了协同过滤算法的基本原理,这个算法虽然比较古老了, 但是思想和原理还是值得我们研究研究的,毕竟这个算法不依赖于任何物品本身或者用户自身的属性, 而仅仅靠用户和物品的交互信息就可以完成推荐任务。它的模型通用性强,可解释强, 不需要太多对应数据领域的专业知识,工程实现简单,效果也不错这也正是它早期流行的原因。同时作为使用较早的一种经典的推荐算法, 它对后面其他传统模型算法的演化和深度模型算法的演化都有启下的作用。

最后贴上王喆老师的《深度学习推荐系统 》里面的思维导图供大家复习巩固一下.

协同过滤
协同过滤

相关代码在github: https://github.com/GuoGuiRong/AI-RecommenderSystem/blob/guirongguo_dev/CollaborativeFiltering/RecommendExample_GuessScore.ipynb

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
    • 1.1 推荐系统主要解决的问题是什么?
      • 1.2 推荐系统的逻辑架构
      • 2 协同过滤算法
        • 2.1 基于用户的协同过滤(UserCF)
          • 2.2 基于物品的协同过滤算法(ItemCF)
            • 2.3 常见的相似度计算的方法
              • 2.4 协同过滤算法的对比
              • 3. 举例说明
                • 3.1 基于物品的协同过滤算法实现
                  • 第1步: 计算物品5与其他物品的的相似性度, 这里我们使用皮尔逊相关系数进行比较, 这样就不用归一化了
                  • 第2步: 找出与物品5最相近的n个物品, 这里的物品比较少, 所以就假设n=2.
                  • 第3步: 根据Alice对最相近的n个物品的打分去计算对物品5的打分情况
                • 3.2 基于用户的协同过滤算法实现
                  • 第1步: 计算用户5和其他用户的皮尔逊相关系数
                  • 第2步: 找出与用户5最相近的n个用户, 这里也假设n=2
                  • 第3步: 根据Alice对最相近的n个用户的打分去计算对物品5的打分情况
              • 4. 总结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档