思维导图:

提到推荐系统,协同过滤算法是最出名啦,协同过滤的重点在于协同,也就是群体互帮互助,互相支持是集体智慧的体现

协同过滤:

当推荐系统度过使用基于内容的推荐阶段后,就有了可观的用户行为,这时候用户行为是正向的,也就是用户或明或暗地表达着喜欢的行为。这些行为可以表达成一个用户和物品的关系矩阵,这个用户物品的关系矩阵中填充的就是用户对物品的态度,但并不是每个位置都有,需要的就是把那些还没有的地方填起来,这个关系矩阵就是协同过滤的基础,一切都围绕这个矩阵进行。

协同过滤是一个比较大的算法范畴,通常划分为两类:

1、基于记忆的协同过滤

简单的理解就是记住每个人消费过什么东西,然后给他推荐相似的东西,或者推荐相似的人消费的东西

1)基于用户的协同过滤(User-Based)

思想:你遇到一个人,你发现他喜欢的电影、喜欢的运动基本上都是你喜欢的,从此,你经常问他有什么好东西可以推荐的

原理:基于用户的协同过滤,核心就是那个用户物品的关系矩阵

具体实现步骤:

第一步,准备用户向量,从这个矩阵中,理论上可以给出每一个用户得到的一个向量(向量具备的特点:向量的维度就是物品的个数;向量是稀疏的,也就是说并不是每个维度上都有数值;向量维度上的取值可以是简单的0或1)

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

第三步,为每一个用户产生推荐结果

实践中遇到的坑:

1)只有原始用户行为日志,需要从中构造矩阵,怎么做?

构造矩阵做协同过滤时,矩阵是稀疏的,典型的稀疏矩阵存储格式:CSR、COO

2)如果用户的向量很长,计算一个相似度则耗时很久,怎么办?

通常采取降低相似度计算复杂度,常用的办法主要有两个:1、对向量采样计算    2、向量化计算

3)如果用户量很大,而且通常如此,两两计算用户相似度也是一个坑,怎么办?

第一个方法是将相似度计算拆成MapReduce任务,将原始矩阵Map成键为用户对,值为两个用户对同一个物品的评分之积,Reduce阶段对这些成集再求和,MapReduce任务结束后再对这些值归一化

第二个方法是不用基于用户的协同过滤,这种计算对象两两之间的相似度的任务,如果数据量不大,一般来说不超过百万个,然后矩阵又是稀疏的,那么很多单机版本的工具其实更快,比如KGraph、GraphCHI等

4)计算推荐时,看上去要为每一个用户计算他和每一个物品的分数?

针对几个特点可以利用一下:1、只有相似的用户喜欢过的物品需要计算,这个数量相比全部物品少了很多 2、把计算过程拆成MapReduce任务,拆Map Reduce任务的做法是:1)遍历每个用户喜欢的物品列表  2)获取该用户的相似用户列表 3)把每一个喜欢的物品Map成两个记录发射出去,一个是键为<相似用户ID,物品ID,1> 三元组,可以拼成一个字符串,值为相似度,另一个键为<相似用户ID,物品ID,0>三元组,值为<喜欢程度*相似度>   4)Reduce阶段,求和后输出   5) <相似用户ID,物品ID,0>的值除以<相似用户ID,物品ID,1>的值

一些改进:惩罚对热门物品的喜欢程度,热门的东西很难反应出用户的真实兴趣,很大可能是被煽动;增加喜欢成都的时间衰减,一般使用一个指数函数,指数就是一个负数

应用场景:基于用户的协同过滤的应用场景,基于用户的协同过滤有两个产出:相似用户列表;基于用户的推荐结果

2) 基于物品(Item-Based)的协同过滤

在基于物品协同过滤出现之前,信息过滤系统最常使用的是基于用户的协同过滤。基于用户的协同过滤首先计算相似用户,然后再根据相思用户的喜好推荐物品,这个算法有几个问题:1)用户数量往往比较大,计算起来比较吃力,称为瓶颈  2)用户的口味其实是变化很快的,不是静态的,所以兴趣迁移问题很难反应出来 3)数据稀疏,用户和用户之间有共同的消费行为实际上是比较少的,而且一般是一些热门物品,对发现用户兴趣帮助不是很大。

与基于用户的不同,基于物品的协同过滤首先计算相似物品,然后在根据用户消费过、或者正在消费的物品为其推荐相似的。

首先,物品的数量或者严格的说,可以推荐的物品数量往往少于用户数量,所以一般计算物品之间的相似度不会称为瓶颈

其次,物品之间的相似度比较静态,它们的速度没有用户的口味变化快,所有完全解决用户兴趣迁移的问题

最后,物品对应的消费者数量较大,对于计算物品之间的相似度稀疏度是好过计算用于之间相似度的

基于物品的协同过滤算法主要步骤如下:1)、构建用户物品的关系矩阵,矩阵元素可以是用户的消费行为,也可以是消费后的评价,还可以是消费行为的某种量化如时间、费用等 2)、假如矩阵的行表示物品,列表示用户的话,那么两两计算行向量之间的相似度,得到物品相似度矩阵,行和列都是物品  3)、产生推荐结果,根据推荐场景不同,有两种产生结果的形式,一种是为某一个物品推荐相关物品,另一种是在个人首页产生类似猜你喜欢的推荐结果。

计算物品相似度:从物品关系矩阵中得到的物品向量是一个稀疏向量;向量的维度是用户,一个用户代表向量的一维,这个向量的总共维度是总用户数量;向量的各个维度的取值是用户对这个物品的消费结果,可以是行为本身的布尔值,也可以是消费行为量化如时间长短、次数多少、费用大小等;没有消费过的就不再表示,所以说是一种稀疏向量

一些改进:

1、物品中心化。把矩阵中的分数,减去的是物品分数的均值;先计算每一个物品收到评分的均值,然后再把物品向量中的分数减去对应物品的均值

2、用户中心化。把矩阵中的分数,减去对应用户分数的均值;先计算每一个用户的评分均值,然后把他打过的所有分数都减去这个均值

上面提到的相似度计算方法,不只是适用于评分类矩阵,也适用于行为矩阵。所谓行为矩阵,即矩阵元素为0或1的布尔值,也就是隐式反馈,隐式反馈取值特殊,有一些基于物品的改进推荐算法无法应用,比如著名的Slope One算法

计算推荐结果

得到物品相似度之后,接下来就是为用户推荐他可能会感兴趣的物品,基于物品的协同过滤,有两种应用场景

第一种属于TopK推荐:当用户访问首页时,汇总和用户已经消费过的物品相似的物品,按照汇总后分数从高到低推出

第二种属于相关推荐:当用户访问一个物品的详细页面时或者完成一个物品消费的结果时,直接获取这个物品的相似物品推荐

2、基于模型的协同过滤

从用户物品关系矩阵中去学习一个模型,从而把那些矩阵空白处填满

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

相似度的本质:推荐算法实际有一个潜在假设,如果两个物体很相似,也就是距离很近,那么这两个物体很容易产生一样的动作

相似度计算方法:

1、数据分类:在计算相似度之前,需要先把度量对象做个简单分类,相似度计算对象是向量,或者是高维空间下的坐标,表示向量的数值就有两种:1、实数值   2、布尔值,也就是0或者1

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

3、余弦相似度:度量两个向量之间的夹角,其实就是用夹角的余弦值来度量。

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

一些改进:调整的余弦相似度,就是先计算向量每个纬度上的均值,然后每个向量在各个维度上都减去均值后,再计算余弦相似度

4、皮尔逊相关度

也是一种余弦相似度,不过先对向量做了中心化 ,在计算余弦相似度。不适合做布尔值向量之间的相关度(因为布尔向量对应0-1分布的随机变量,这样的随机变量变化只有有限的两个取值,根本没有‘变化趋势,高低起伏’)

5、杰卡德(Jaccard)相似度

表示两个集合德交集元素个数在并集中所占德比例,由于集合非常适用于布尔向量表示,所以杰卡德相似度简直就是为布尔值向量私人定做的。对应德计算方式是:1、分子是两个布尔向量做点积运算,得到的就是交集元素个数  2、分母是两个布尔向量做或运算,再求元素和。

比较:按照向量维度取值是否是布尔值来看,杰卡德相似度就只适合布尔值向量,余弦相似度适用于两种向量,欧式距离适合非布尔值向量。

推荐系统笔记(近邻推荐)相关推荐

  1. 推荐系统笔记(内容推荐)

    思维导图: 做好推荐系统,需要分三步:1.认识每一个用户  2.给用户推荐用户感兴趣的东西  3.等待各指标上升 认识用户:用户画像 1.什么是用户画像? 用户画像对应的英文有两个:Personas和 ...

  2. 推荐系统详解(三)近邻推荐

    协同过滤的重点在于"协同",所谓协同,也就是群体互帮互助,互相支持是集体智慧的体现,协同过滤也是这般简单直接,历久弥新. 协同过滤 当你的推荐系统度过了只能使用基于内容的推荐阶段后 ...

  3. 推荐系统笔记:基于模型的协同过滤

    1 介绍 基于邻域的协同过滤方法可以看作是机器学习中常用的k-最近邻分类器KNN的泛化. 这些方法是基于实例的方法,因此,除了可选的预处理阶段之外,没有专门为预测预先创建模型. 推荐系统笔记:Intr ...

  4. 推荐系统笔记(九):SGL --利用自监督对比学习缓解推荐系统长尾效应

    背景 利用图卷积神经网络处理推荐系统的问题任然有很大局限性,即使是LightGCN也存在的问题,关于LightGCN的知识和原理实现可以参考我的另外几篇博客:链接 其局限性主要在于: (1)高度节点对 ...

  5. 推荐系统笔记:矩阵分解+基于邻居的模型

    由于其启发式性质,基于邻域的方法通常被认为与其他优化模型具有内在的不同. 尽管如此,结果表明基于邻域的方法也可以嵌入在其他优化模型的上下文中. 这是一个相当方便的框架,因为它为邻域模型与其他优化模型( ...

  6. 推荐系统笔记:基于矩阵分解(总结篇)

    推荐系统笔记:基于潜在因子模型的协同过滤(latent factor model)_UQI-LIUWJ的博客-CSDN博客 推荐系统笔记:无任何限制的矩阵分解_UQI-LIUWJ的博客-CSDN博客 ...

  7. 推荐系统笔记:基于SVD的协同过滤

    1 奇异值分解 奇异值分解(SVD)是矩阵分解的一种形式,其中U和V的列被约束为相互正交 相互正交的优点是概念之间可以完全独立,并且可以用散点几何解释它们. 然而,这种分解的语义解释通常比较困难,因为 ...

  8. 推荐系统笔记(十三):SGL算法的代码实现

    前言         本算法是在LightGCN的代码上的基础实现的,LightGCN的代码和原理参考我前面几篇的博客:推荐系统笔记(六):LightGCN代码实现_甘霖那的博客-CSDN博客 由于L ...

  9. 推荐系统笔记:基于非负矩阵分解的协同过滤

    1 非负矩阵分解 非负矩阵分解 (NMF) 可用于非负的评级矩阵. 这种方法的主要优势不一定是准确性,而是它在理解用户-项目交互方面提供的高度可解释性. 与其他形式的矩阵分解的主要区别在于因子 U 和 ...

最新文章

  1. php adodb使用,常用的php ADODB使用方法集锦
  2. Winform中DataGridView绑定IList数据源后的排序
  3. 【渝粤教育】 国家开放大学2020年春季 1032成本管理 参考试题
  4. linux 远程挂载摄像头_如何实现嵌入式Linux下USB摄像头视频采集
  5. Web前端技术历经的洗礼和蜕变
  6. 和一个刚毕业不久的朋友聊天
  7. 数据结构——二叉搜索树的C语言实现
  8. oracle 11gr2 asm安装,OEL6.1下oracle 11gr2 ASM安装
  9. python调用函数_Python 函数中的 4 种参数类型
  10. MySQL在windows的my-default.ini配置
  11. 苹果2020年全系展望:iPhone12不会去掉刘海但5G是必须的
  12. Cocos2d-X中国象棋的发展《五岁以下儿童》摆棋
  13. JavaScript学习指南 修订版pdf
  14. 【概率论】边缘分布和联合分布
  15. PDF 文字识别网站
  16. win10安装apache环境
  17. 简单的个人介绍网页【附代码】
  18. (转载)-关于sg函数的理解
  19. git中手动删除的文件如何在git中删除
  20. Vuforia的学习(二)Vuforia的安装

热门文章

  1. 《AngularJS深度剖析与最佳实践》一2.2 模块
  2. Vs 2015 调试ASP.NET Core修改监听端口
  3. 关于expanded一级二级菜单数据的分组排序
  4. Json-lib使用——JSONObject与JSONArray
  5. 【转】最佳 WordPress 缓存插件:WP Super Cache
  6. 边缘会话控制器SBC
  7. 基于SD卡的FatFs文件系统(FatFs移植到STM32)
  8. WaitForMultipleObjects用法详解,一看就懂
  9. CSP认证201703-2 学生排队[C++题解]:模拟
  10. vlc android 编译 mac,在Mac中编译vlc-android小结