推荐系列(三):协同过滤

简介: 协同过滤为了解决基于内容过滤的一些限制,协同过滤同时使用用户和项目之间的相似性来提供推荐。这样会允许偶然的推荐出现; 也就是说,协同过滤模型可以基于类似用户B的兴趣向用户A推荐项目。此外,可以自动学习embedding特征,而不依赖于手工设计的特征。

协同过滤

为了解决基于内容过滤的一些限制,协同过滤同时使用用户和项目之间的相似性来提供推荐。这样会允许偶然的推荐出现; 也就是说,协同过滤模型可以基于类似用户B的兴趣向用户A推荐项目。此外,可以自动学习embedding特征,而不依赖于手工设计的特征。

电影推荐示例

假设现有一个电影推荐系统,其中训练数据由反馈矩阵组成,其中:

  • 每行代表一个用户。
  • 每列代表一个项目(电影)。

有关电影的反馈分为两类:

  • 显式 - 用户通过提供数字评级来指定他们对特定电影的喜爱程度。
  • 隐含 - 如果用户观看电影,系统会推断出用户对其感兴趣。

为简化起见,我们假设反馈矩阵是二进制的; 也就是说,“1”表示对电影感兴趣, "0"表示对其不感兴趣。

当用户访问主页时,系统应根据以下两者推荐电影:

  • 与用户过去喜欢的电影相似;
  • 类似用户喜欢的电影;

为了便于说明,让我们设计下表中描述电影的一些特征:

电影 评分 描述
黑暗骑士崛起 PG-13 蝙蝠侠在DC Comics宇宙中设置的黑暗骑士续集中努力拯救Gotham City免受核毁灭
哈利·波特与魔法石 PG 一个孤儿发现他是一名巫师,并在霍格沃茨魔法学校就读,在那里他完成了他与邪恶伏地魔的第一场战斗
史莱克 PG 一个可爱的食人魔和他的伙伴开始执行救援公主菲奥娜的任务,菲奥娜被龙囚禁在她的城堡里
贝尔维尔三胞胎 PG-13 当环法自行车赛冠军在环法自行车赛期间被绑架时,他的祖母和狗在在三位年长的爵士歌手的帮助下,拯救了他
纪念品 [R 一个失忆症人拼命寻求通过在他的身体上纹身线索来解决他妻子的谋杀案。

1维嵌入

假设我们为每部电影分配一个标量 [-1,1]描述电影是针对儿童(负值)还是成人(正值)。假设我们还为每个用户分配一个标量[-1,1]描述用户对儿童电影(接近-1)或成人电影(接近+1)的兴趣。对于我们期望用户喜欢的电影,电影嵌入和用户嵌入的产品应该更接近1。

图像显示了沿着一维嵌入空间排列的几部电影和用户。 沿此轴的每部电影的位置描述这是儿童电影(左)还是成人电影(右)。 用户的位置描述了对儿童或成人电影的兴趣。

在下图中,每个复选标记标识出特定用户观看的电影。很明显,第三和第四个用户具有通过该特征很好地解释的偏好:第三个用户更喜欢儿童电影,而第四用户更喜欢成人电影。然而,该一维特征并没有很好地解释第一和第二用户的偏好。

反馈矩阵的图像,其中行对应于用户,列对应于电影。 每个用户和每个电影被映射到一维嵌入(如前图所示),使得两个嵌入的乘积近似于反馈矩阵中的地面实况值。

2维嵌入

一维特征不足以解释所有用户的偏好。为了克服这个问题,让我们添加第二个特征:每部电影是爆米花电影或艺术片的程度。通过第二个特征,我们现在可以使用以下二维嵌入来表示每部电影:

图像显示了在二维嵌入空间上排列的几部电影和用户。 每个电影沿水平轴的位置描述这是儿童电影(左)还是成人电影(右);  它沿垂直轴的位置描述了这是一部重磅电影(上)还是一部艺术电影(下图)。 用户的位置反映了他们对每个类别的兴趣。

我们再次将用户置于相同的嵌入空间中以最好地解释反馈矩阵:对于每个(用户,项目)对,我们希望当用户观看时,用户嵌入和电影嵌入的点积接近1, 否则为0。

相同反馈矩阵的图像。 这次,每个用户和每个电影被映射到二维嵌入(如前图所示),使得两个嵌入的点积近似于反馈矩阵中的基础真值。

注意:我们在同一个嵌入空间中表示了项目和用户,可以将嵌入空间视为项目和用户共有的抽象表示,因此,我们可以使用相似性度量来衡量相似性或相关性。

在这个例子中,我们手工设计了嵌入。实际上,嵌入可以自动学习,这是协同过滤模型的强大功能。

当模型学习嵌入时,这种方法的协同性质是显而易见的。假设电影的嵌入向量是固定的。然后模型可以为用户学习嵌入向量,并能最好地解释他们的偏好。因此,具有相似偏好的用户的嵌入向量将紧密结合在一起。类似地,如果用户的嵌入向量是固定的,那么我们可以学习电影嵌入以最好地解释反馈矩阵。最终,类似用户喜欢的电影嵌入将在嵌入空间中相近。

目录
相关文章
|
Linux 测试技术 Shell
Linux expect命令详解
在Linux系统中,expect 是一款非常有用的工具,它允许用户自动化与需要用户输入进行交互的程序。本文将深入探讨expect命令的基本语法、使用方法以及一些最佳实践。
626 5
Linux expect命令详解
|
前端开发 JavaScript API
构建高效Web应用:React与Node.js的完美结合
【8月更文挑战第29天】在当今快速变化的软件开发领域,构建高性能、可扩展的Web应用成为开发者的首要任务。本文将深入探讨如何利用React和Node.js这两大技术栈,打造一个高效且响应迅速的现代Web应用。从前端的用户界面设计到后端的服务逻辑处理,我们将一步步分析这两种技术如何协同工作,提升应用性能,并确保用户体验的流畅性。通过实际代码示例和架构设计的解析,本篇文章旨在为读者提供一套清晰的指南,帮助他们在项目开发中做出更明智的技术选择。
|
JavaScript
Vue多图组合走马灯
这篇文章介绍了如何在Vue框架中创建一个多图组合的走马灯组件,允许自定义滑动间隔和图片区域宽度,以展示多个图片。
178 0
Vue多图组合走马灯
|
机器学习/深度学习 Python
利用Python实现一个简单的机器学习模型:线性回归详解
利用Python实现一个简单的机器学习模型:线性回归详解
400 2
|
机器学习/深度学习 人工智能
ACL 2024:提升大模型持续学习性能,哈工大、度小满提出共享注意力框架SAPT
【6月更文挑战第8天】哈工大和度小满在ACL 2024会议上提出SAPT,一种共享注意力框架,用于提升大模型的持续学习性能,解决灾难性遗忘和知识转移问题。SAPT通过协调学习和选择模块,共享注意力以保留旧知识并有效转移至新任务。实验显示SAPT在多个基准和模型规模上表现优秀,但可能增加模型复杂性和计算成本,且在特定任务中适用性需进一步评估。论文链接:https://arxiv.org/abs/2401.08295
264 8
|
监控 前端开发 测试技术
三三裂变系统开发/详情模式/方案设计
三三裂变系统开发概要: 理解系统目标,涉及三级裂变增长策略。 关键步骤包括需求分析、系统设计、技术选型、编码、测试及优化。 - 注意点:安全性、可扩展性和用户体验。 部署后需持续监控与维护,适应未来功能扩展。
|
存储 算法 编译器
【数据结构与算法】使用数组实现栈:原理、步骤与应用
【数据结构与算法】使用数组实现栈:原理、步骤与应用
|
应用服务中间件 Shell nginx
制作docker镜像的dockerfile编写规则汇总
制作docker镜像的dockerfile编写规则汇总
280 0
|
数据采集 消息中间件 安全
.NET使用分布式网络爬虫框架DotnetSpider快速开发爬虫功能
.NET使用分布式网络爬虫框架DotnetSpider快速开发爬虫功能
221 0
|
人工智能
老照片修复:黑白照片上色+面部以及画质的增强
历久弥新:用AI修复亚运会珍贵史料
306 1