推荐系列(四):矩阵分解|Matrix Factorization

简介: 简单讲解推荐系统中的矩阵分解

矩阵分解|Matrix Factorization

在上节讲过,用户和item之间的关系可以用一个关系矩阵表示,而矩阵分解式一个简单的嵌入模型。假设一个用户反馈矩阵:

$$ A \in R^{m \times n} $$

,其中m表示用户的数量,n表示item的数量

  • 用户嵌入矩阵

$$ U \in \mathbb R^{m \times d} $$

  • 商品嵌入矩阵

$$ V \in \mathbb R^{n \times d} $$

使用重复电影示例的矩阵分解的插图。

嵌入矩阵可以看作是

$$ U V^T(i, j)U . V^T\langle U_i, V_j\rangle i j A_{i, j} $$

的点积

矩阵分解一般是用近似的方法表示,而不是使用整个矩阵表示,整个矩阵的元素个数是O(nm)个元素,而嵌入矩阵的元素个数是O((m+n)d),其中d的维数一般远小于m和n的维度。因此,嵌入矩阵能够表示数据的潜在结构,这表明观察到的结果接近于低维子空间,类似于降维。在上述例子中,由于维度太低,以至于这个优点被忽略不计。然而,在现实的推荐系统中,使用矩阵分解的效果可以比学习完整矩阵会更加高效。

选择目标函数

一个常用的目标函数是欧式距离,这里以此为例。为此,最小化所有观察到的item对的误差平方和:

$$ \min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \sum_{(i, j) \in \text{obs}} (A_{ij} - \langle U_{i}, V_{j} \rangle)^2 $$

在上述目标函数中,只对观察到的item对(i,j)求和,即用户反馈矩阵中的非零值。然而,只对观察到值进行处理并不是一个好的想法 ,因为矩阵中的所有元素都会对模型产生影响,如果只用观察到的值进行仿真模拟,则该模型无法得出有效的推荐且泛化能力差。一句话总结:在推荐系统中,正样本数据集和负样本数据集都是有用的。

因此会有另外的求和方法,如下所示:

三个矩阵的图示:仅观察到矩阵分解,加权分解和奇异值分解。

将为观察到的item对的值设置为0, 并对矩阵中所有的值求和,因此求和公式从之前的只对观察到的item对求和之外,还需要对未观察到的item对,求和公式如下所示:

$$ \min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \|A - U V^T\|_F^2 $$

上述问题可以使用奇异值分解(Singular Value Decomposition , SVD)处理,然而SVD不是一个很好的解决方法,这是由于其在实际应用中,矩阵A可能是非常稀疏的,比如在视频或新闻APP中,热门的item可能被更多的用户浏览,导致矩阵很稀疏。稀疏矩阵会导致SVD的求解结果近似为0,导致泛化能力很差。

相反,加权矩阵分解 将目标分解为两个总和:

  • 观察到的条目的总和;
  • 未观察到的条目的总和;

$$ \min_{U \in \mathbb R^{m \times d},\ V \in \mathbb R^{n \times d}} \sum_{(i, j) \in \text{obs}} (A_{ij} - \langle U_{i}, V_{j} \rangle)^2 + w_0 \sum_{(i, j) \not \in \text{obs}} (\langle U_i, V_j\rangle)^2 $$

注意,在实际应用中,还需要仔细权衡观察到的item对。例如,热门item或频繁使用(例如,重度用户)可能会主导目标函数。因此,我们可以通过对训练样例进行加权重来考虑item频率来校正模型效果。换句话说,可以通过以下方式替换目标函数:

$$ \sum_{(i, j) \in \text{obs}} w_{i, j} (A_{i, j} - \langle U_i, V_j \rangle)^2 + w_0 \sum_{i, j \not \in \text{obs}} \langle U_i, V_j \rangle^2 $$

最小化目标函数

最小化目标函数的常用算法包括:

  • 随机梯度下降(SGD) 是使损失函数最小化的通用方法。
  • 加权交替最小二乘WALS)专门针对这一特定目标。

目标函数对于U和V都是二次的,其中,随机梯度下降算法是比较常用的模型训练方法,这里不做过多的介绍,而WALS通过随机初始化嵌入,然后交替进行以下工作:

  • 固定U,对V求解
  • 固定V, 对U求解

关于WALS的详细介绍可以看该图:
wals_method

SGD vs. WALS

SGD和WALS各有自身的优点有缺点:

SGD

  • 非常灵活 :可以使用其他损失函数
  • 可以并行化
  • 收敛较慢
  • 更难处理未观察到的item

WALS

  • 依赖于均方误差
  • 可以并行化
  • 收敛速度比SGD快
  • 更容易处理未观察到的item
目录
相关文章
|
安全 项目管理
一文搞懂需求流程规范的制定方法和落地技巧
随着业务和产品的发展、团队的不断扩大,很多团队都不可避免的会遇到需求流程混乱的问题。虽然有的团队也编写了一些“需求流程规范”的文档,但最终却流于纸面,难以在团队真正落地。如何科学制定并有效落实需求管理规范呢?对此,云效产品经理陈逊进行了非常详细的直播分享,本文是他经验的文字总结。
103559 19
|
搜索推荐 算法 数据挖掘
# 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法
# 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法
# 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法
|
数据可视化 数据挖掘 Python
【数据分析与可视化】利用Python对泰坦尼克号幸存者数据分析与可视化(附源码)
【数据分析与可视化】利用Python对泰坦尼克号幸存者数据分析与可视化(附源码)
676 0
|
3月前
|
数据采集 Web App开发 JavaScript
Python爬虫解析动态网页:从渲染到数据提取
Python爬虫解析动态网页:从渲染到数据提取
|
运维 监控 关系型数据库
运维实战:Windows服务挂掉了怎么办,通过Bat脚本实现自动重启
本文介绍了如何使用Bat脚本自动监控并重启Windows服务器上的挂掉服务,例如MySQL,以避免在假期等情况下需要紧急处理问题。首先,创建一个Bat脚本,设定每小时检查一次服务状态,如果服务停止则自动重启。脚本内容包括检查服务是否运行并根据状态执行相应操作。同时,脚本中包含了确保以管理员权限运行的代码。 脚本需设置为ANSI编码以防止乱码。推荐将Bat脚本封装为Windows服务以保证稳定运行,提供了使用NSSM工具、Windows服务程序和开源的Java工具winsw将批处理脚本转化为服务的方法。这些方法可以确保服务在后台可靠运行,即使在服务意外停止时也能自动恢复。
|
7月前
|
人工智能 小程序 API
销售易NeoCRM与纷享销客:功能、体验与价格全解析
销售易NeoCRM和纷享销客是国内知名的CRM解决方案,各有特色。销售易功能全面,涵盖销售、客户、营销管理及AI赋能,适合中大型企业;纷享销客则以强大的连接能力和业务协同见长,用户体验佳,性价比高,更适合中小企业。两者在价格、用户体验和适用场景上有所差异,企业应根据自身需求选择合适的CRM系统。
|
分布式计算 数据挖掘 数据处理
基于 MaxCompute MaxFrame 实现分布式 Pandas 处理
阿里云分布式计算框架 MaxCompute MaxFrame 兼容 Pandas 接口且自动进行分布式处理,在保证强大数据处理能力的同时,可以大幅度提高数据处理规模及计算效率。
717 1
|
Python
python使用tkinter库,封装操作excel为GUI程序
python使用tkinter库,封装操作excel为GUI程序
513 0
|
缓存 自然语言处理 JavaScript
手把手做一个公众号GPT智能客服【一】准备工作
手把手做一个公众号GPT智能客服【一】准备工作
322 0
|
Web App开发 移动开发 JavaScript
一篇文带你使用js实现拖拽排序
一篇文带你使用js实现拖拽排序

热门文章

最新文章