协同过滤与矩阵分解

2023-11-06

协同过滤算法的基本原理

用户行为数据是推荐系统最常用,也是最关键的数据。用户的潜在兴趣、用户对物品的评价好坏都反映在用户的行为历史中。而协同过滤算法,就是一种完全依赖用户和物品之间行为关系的推荐算法。我们从它的名字“协同过滤”中,也可以窥探到它背后的原理,就是 “协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息
一起看一个电商场景下的例子。这个电商推荐系统从得到原始数据到生成最终推荐分数,全过程一共可以总结为 6 个步骤,如下所示。
在这里插入图片描述
首先,我们可以看到,电商网站的商品库里一共有 4 件商品:一个游戏机、一本小说、一本杂志,以及一台电视机。假设,现在有一名用户 X 访问了这个电商网站,电商网站的推荐系统需要决定是否推荐电视机给用户 X。
为了进行这项预测,推荐系统可以利用的数据有用户 X 对其他商品的历史评价数据,以及其他用户对这些商品的历史评价数据。我在图 b 中用绿色“点赞”的标志表示好评,用红色“踩”的标志表示了差评。这样一来,用户、商品和评价记录就构成了带有标识的有向图。

接下来,为了方便计算,我们将有向图转换成矩阵的形式。这个矩阵表示了物品共同出现的情况,因此被称为“共现矩阵”。其中,用户作为矩阵行坐标,物品作为列坐标,我们再把“点赞”和“踩”的用户行为数据转换为矩阵中相应的元素值。这里,我们将“点赞”的值设为 1,将“踩”的值设为 -1,“没有数据”置为 0(如果用户对物品有具体的评分,那么共现矩阵中的元素值可以取具体的评分值,没有数据时的默认评分也可以取评分的均值)。
生成共现矩阵之后,推荐问题就转换成了预测矩阵中问号元素(图 d所示)的值的问题。由于在“协同”过滤算法中,推荐的原理是让用户考虑与自己兴趣相似用户的意见。因此,我们预测的第一步就是找到与用户 X 兴趣最相似的 n(Top n 用户,这里的 n 是一个超参数)个用户,然后综合相似用户对“电视机”的评价,得出用户 X 对“电视机”评价的预测。
从共现矩阵中我们可以知道,用户 B 和用户 C 由于跟用户 X 的行向量近似,被选为 Top n(这里假设 n 取 2)相似用户,接着在图 e 中我们可以看到,用户 B 和用户 C 对“电视机”的评价均是负面的。因为相似用户对“电视机”的评价是负面的,所以我们可以预测出用户 X 对“电视机”的评价也是负面的。在实际的推荐过程中,推荐系统不会向用户 X 推荐“电视机”这一物品。
到这里,协同过滤的算法流程我们就说完了。也许你也已经发现了,这个过程中有两点不严谨的地方,一是用户相似度到底该怎么定义,二是最后我们预测用户 X 对“电视机”的评价也是负面的,这个负面程度应该有一个分数来衡量,但这个推荐分数该怎么计算呢?

计算用户相似度

首先,我们来解决计算用户相似度的问题。计算用户相似度其实并不是什么难事,因为在共现矩阵中,每个用户对应的行向量其实就可以当作一个用户的 Embedding 向量。 Embedding 相似度的计算方法,最经典的方法就是利用余弦相似度了,它衡量了用户向量 i 和用户向量 j 之间的向量夹角大小。夹角越小,余弦相似度越大,两个用户越相似,它的定义如下:
在这里插入图片描述
除了最常用的余弦相似度之外,相似度的定义还有皮尔逊相关系数、欧式距离等等。

用户评分的预测

接下来,我们再来看看推荐分数的计算。在获得 Top n 个相似用户之后,利用 Top n 用户生成最终的用户 u 对物品 p 的评分是一个比较直接的过程。这里,我们假设的是“目标用户与其相似用户的喜好是相似的”,根据这个假设,我们可以利用相似用户的已有评价对目标用户的偏好进行预测。最常用的方式是,利用用户相似度和相似用户评价的加权平均值,来获得目标用户的评价预测,公式如下所示。
在这里插入图片描述

矩阵分解算法的原理

虽然说协同过滤是目前公认的最经典的推荐算法,但我们还是可以轻松找出它的缺点,那就是共现矩阵往往非常稀疏,在用户历史行为很少的情况下,寻找相似用户的过程并不准确。于是,著名的视频流媒体公司 Netflix 对协同过滤算法进行了改进,提出了矩阵分解算法,加强了模型处理稀疏矩阵的能力。
这里用一个直观的例子来理解一下什么叫做矩阵分解
在这里插入图片描述
左图为协同过滤,右图为矩阵分解
左图 所示,协同过滤算法找到用户可能喜欢的视频的方式很直观,就是利用用户的观看历史,找到跟目标用户 Joe 看过同样视频的相似用户,然后找到这些相似用户喜欢看的其他视频,推荐给目标用户 Joe。
矩阵分解算法则是期望为每一个用户和视频生成一个隐向量,将用户和视频定位到隐向量的表示空间上(右图所示),距离相近的用户和视频表明兴趣特点接近,在推荐过程中,我们就应该把距离相近的视频推荐给目标用户。例如,如果希望为右图中的用户 Dave 推荐视频,我们可以找到离 Dave 的用户向量最近的两个视频向量,它们分别是《Ocean’s 11》和《The Lion King》,然后我们可以根据向量距离由近到远的顺序生成 Dave 的推荐列表。
矩阵分解就相当于一种 Embedding 方法,矩阵分解的主要过程,就是先分解协同过滤生成的共现矩阵,生成用户和物品的隐向量,再通过用户和物品隐向量间的相似性进行推荐。
那这个过程的关键就在于如何分解这个共现矩阵了。从形式上看,矩阵分解的过程是直观的,就是把一个 mxn 的共现矩阵,分解成一个 mxk 的用户矩阵和 kxn 的物品矩阵相乘的形式(如下图)
在这里插入图片描述
有了用户矩阵和物品矩阵,用户隐向量和物品隐向量就非常好提取了。用户隐向量就是用户矩阵相应的行向量,而物品隐向量就是物品矩阵相应的列向量。

那关键问题就剩下一个,也就是我们该通过什么方法把共现矩阵分解开。最常用的方法就是梯度下降。简单来说就是通过求取偏导的形式来更新权重。梯度更新的公式是 (wt+1=wt− α∗(∂w/∂L)​)。为了实现梯度下降,最重要的一步是定义损失函数 L,定义好损失函数我们才能够通过求导的方式找到梯度方向,这里我们就给出矩阵分解损失函数的定义如下。
在这里插入图片描述
这个目标函数里面,rui​ 是共现矩阵里面用户 u 对物品 i 的评分,qi​ 是物品向量,pu​ 是用户向量,K 是所有用户评分物品的全体集合。通过目标函数的定义我们可以看到,我们要求的物品向量和用户向量,是希望让物品向量和用户向量之积跟原始的评分之差的平方尽量小。简单来说就是,我们希望用户矩阵和物品矩阵的乘积尽量接近原来的共现矩阵。

总结

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

协同过滤与矩阵分解 的相关文章

随机推荐

  • Linux查看磁盘空间大小的命令

    1 查看磁盘空间大小的命令 df df命令用于查看磁盘分区上的磁盘空间 包括使用了多少 还剩多少 默认单位是KB 比如以下命令 df hl 执行的结果每列的含义 第一列Filesystem 磁盘分区 第二列Size 磁盘分区的大小 第三列U
  • 关机代码(强制关机)

    关机代码 很简单的一个代码 代码如下 from os import 库 system shutdown s t 10 强制关机 可以恶搞朋友 手动狗头 但是有点废朋友 滑稽
  • uni_app“一课一得”

    什么是uni app uni app是一个使用Vue js开发所有前端应用的框架 开发者编写一套代码 可发布到iOS Android Web 响应式 以及各种小程序 微信 支付宝 百度 头条 飞书 QQ 快手 钉钉 淘宝 快应用等多个平台
  • Unity InputSystem (一)

    什么是InputSystem InputSystem 是 2019 年 Unity 新推出的插件 输入系统包实现了一个系统来使用任何类型的输入设备来控制你的 Unity 内容 它旨在成为 Unity 的经典输入管理器更强大 更灵活 更可配置
  • C++调用类成员函数

    ifndef CLASS H define CLASS H class CanExtTxPDO t private unsigned char i public unsigned char buffer 10 CanExtTxPDO t u
  • 数据结构入门-二叉树篇(一)

    144 二叉树的前序遍历 给你二叉树的根节点 root 返回它节点值的前序遍历 示例 输入 root 1 null 2 3 输出 1 2 3 前序遍历是二叉树遍历的一种 首先访问根节点 然后遍历左子树 最后遍历右子树 可以记作根左右 解题思
  • PyTorch自然语言处理

    特点 展示如何使用基于 Python 的深度学习库 PyTorch 应用这些方法 演示如何使用 PyTorch 构建应用程序 探索计算图和监督学习范式 掌握 PyTorch 优化张量操作库的基础知识 概述传统的 NLP 概念和方法 学习构建
  • python将折线平滑为曲线

    目录 曲线的曲率介绍 平滑方法介绍 1 环境及模块介绍 2 代码示例 3 整体代码 曲线的曲率介绍 曲线的曲率 curvature 就是针对曲线上某个点的切线方向角对弧长的转动率 通过微分来定义 表明曲线偏离直线的程度 数学上表明曲线在某一
  • 编译器预定义总结.

    http sourceforge net p predef wiki Compilers ACC Type Macro Identification ACC Altium MicroBlaze C Type Macro Format Des
  • Faq about multimedia

    VCN Video Compression Networking Glossary This is a collection of often used and misused technical terms regarding video
  • 【基础知识】11、github上传本地代码

    第一步 下载git bash 下载链接 按步骤安装即可 第二步 配置git bash 一 输入ssh keygen t rsa C 24428078 qq com 获取钥匙 邮箱为github注册的邮箱 输入上述命令时注意空格 出现下面界面
  • bootstrap引入

  • pww区域连接特征提取算法

    主题思想 任何一个图像 肯定由多个或一个区域 每个区域在横向扫描时 会有分裂和合并 比如圆环 顶部有一个分裂点 底部有一个合并点 没有分裂合并的图形 就是简单的凸图像 很容易通过外形识别 而复杂的图像 就是凹的 就需要分裂合并点来识别 旋转
  • 动作捕捉(Motion Capture)文件BVH的解读笔记

    Bvh里面的JOINT 以及ROOT 都表示一个坐标空间 我们称之为关节坐标空间 在这个坐标空间里 它有下一级的子坐标空间 也就是下一级的JOINT 子坐标空间的原点位置由子JOINT的OFFSET字段指明 也就是说一个JOINT的OFFS
  • Linux系统内核文件Cache管理机制简介

    1 前言 自从诞生以来 Linux 就被不断完善和普及 目前它已经成为主流通用操作系统之一 使用得非常广泛 它与 Windows UNIX 一起占据了操作系统领域几乎所有的市场份额 特别是在高性能计算领域 Linux 已经成为一个占主导地位
  • 一文让前端搞懂shell编程

    概述 前端程序员有时会遇到部署项目的情况 有时需要看懂后台或者运维写的脚本 如果转型AI 数据分析和模型训练也经常用到shell编程 掌握shell编程 你的编程之路会越走越宽 shell 解析器 sudo cat etc shells t
  • Win7下使用U盘安装Ubuntu16.04双系统图文教程(亲测)

    安装步骤 1 下载Ubuntu 16 04镜像软件 2 使用ultraISO软件制作U盘启动盘 3 利用U盘启动盘来安装Ubuntu系统 4 使用EasyBCD创建启动系统启动引导 可以省略 5 重启系统即可 一 下载ubuntu16 04
  • 使用Semaphore 实现一个简单的限流器

    使用Semaphore 实现一个简单的限流器 java api Java的api中 提供了semaphore这个线程同步的辅助类 用来控制同时访问共享资源的线程数量 Semaphore提供的主要方法如下 void acquire 获取一个信
  • NUC10 i7 黑苹果Big Sur 11.4 + win10 双系统安装指南

    说明 硬件 Intel NUC 10代 i7 10710U 系统说明 Mac OS Big Sur 11 4 Windows 10 注 本文默认已经安装好windows 安装过程就和普通的单系统安装步骤一样 安装步骤略 其他说明 由于个人知
  • 协同过滤与矩阵分解

    协同过滤算法的基本原理 用户行为数据是推荐系统最常用 也是最关键的数据 用户的潜在兴趣 用户对物品的评价好坏都反映在用户的行为历史中 而协同过滤算法 就是一种完全依赖用户和物品之间行为关系的推荐算法 我们从它的名字 协同过滤 中 也可以窥探