游乐游手机版
首页/AI教程/文章详情

推荐系统矩阵分解算法:原理、优化与应用详解

时间:2026-08-03 20:06
矩阵分解|Matrix Factorization 上一部分我们介绍了用户与物品之间的关系可以通过矩阵来表示,而矩阵分解是一种简洁高效的嵌入模型。假设我们有一个用户反馈矩阵: $$ A in R^{m times n} $$ 其中 (m ) 代表用户总数, (n ) 代表物品总数。 用户嵌入矩

矩阵分解|Matrix Factorization

上一部分我们介绍了用户与物品之间的关系可以通过矩阵来表示,而矩阵分解是一种简洁高效的嵌入模型。假设我们有一个用户反馈矩阵:

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

其中 \(m\) 代表用户总数,\(n\) 代表物品总数。

用户嵌入矩阵

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

商品嵌入矩阵

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

这两个嵌入矩阵的点积,可以近似还原出原始矩阵 \(A\):

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

如何选择目标函数

目标函数该如何选取?最常用的方式是欧几里得距离,我们就以此为例。直观来看,需要最小化所有已观察到的用户-物品对的误差平方和:

$$ \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 $$

这个公式仅对观察到的 \((i, j)\) 求和,即反馈矩阵中非零的项。但问题随之而来——只考虑观察到的值真的可行吗?实际上并不理想。如果只依赖正样本,模型会忽略用户未交互的负样本,导致推荐效果下降,泛化能力变差。简而言之,正负样本缺一不可。

那么如何改进呢?更常见的做法是将未观察到的项也纳入优化。具体来说,将未观察到的 \((i, j)\) 的值设为 0,然后对矩阵中所有元素求和:

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

这个形式看起来可以直接用奇异值分解(SVD)求解。但 SVD 在实际应用中并不好用,原因在于用户反馈矩阵通常极其稀疏——例如在视频或新闻 App 中,热门内容被大量用户浏览,而长尾内容几乎无人问津。稀疏矩阵使用 SVD 后,结果容易趋近于零,泛化能力自然较弱。

于是,加权矩阵分解(Weighted Matrix Factorization)应运而生。它将目标函数拆分为两部分:

  • 观察到的条目对应的总和
  • 未观察到的条目对应的总和

公式如下:

$$ \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) \notin \text{obs}} (\langle U_i, V_j\rangle)^2 $$

也可以写成带权重的形式:

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

最小化目标函数的方法

如何最小化目标函数?常用的算法有两种:

  • 随机梯度下降(SGD)——通用方法,灵活但收敛较慢
  • 加权交替最小二乘(WALS)——专门针对该目标设计

目标函数对 \(U\) 和 \(V\) 都是二次的。SGD 作为通用工具,这里不再展开。WALS 的思路是先随机初始化嵌入,然后交替进行:固定 \(U\),对 \(V\) 求解;再固定 \(V\),对 \(U\) 求解。具体流程可参考下图:

wals_method

SGD 与 WALS 的对比

SGD 和 WALS 各有所长,也各有短板。

SGD

  • 非常灵活:可以换用其他损失函数
  • 可以并行化处理
  • 收敛速度较慢
  • 处理未观察到的物品时更困难

WALS

  • 依赖于均方误差
  • 支持并行化
  • 收敛速度比 SGD 更快
  • 更容易处理未观察到的物品

具体选择哪个,取决于实际场景——如果数据稀疏且对收敛速度要求较高,WALS 通常更顺手;如果损失函数需要定制,SGD 的灵活性则成为优势。

来源:https://developer.aliyun.com/article/706703
上一篇Spring Boot项目中使用tools-redis实现分布式缓存最佳实践方案 下一篇如何用码道AI编程助手开发推箱子益智网页游戏
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
CAD零基础入门教程:坐标输入、图层管理与基础绘图命令
AI教程 · 2026-09-01

CAD零基础入门教程:坐标输入、图层管理与基础绘图命令

本文面向CAD零基础学习者,系统讲解坐标输入、图层管理与基础绘图命令的核心用法。通过分步实操与常见问题排查,帮助新手建立精确绘图习惯,掌握规范出图的基础能力。

CAD从入门到项目交付:绘图、标注、图块与实战工作流
AI教程 · 2026-09-01

CAD从入门到项目交付:绘图、标注、图块与实战工作流

掌握CAD的核心在于建立“画得准、标得清、复用快、交付稳”的工作流。本文提供从环境设置、高频命令组合、标注规范、图块标准化到项目分阶段交付的完整路径,帮助初学者避免常见返工陷阱,独立完成可检查、可复用、可打印的工程图纸。

Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤
AI教程 · 2026-09-01

Claude Code 登录指南:个人、Teams 与企业账号区分与授权步骤

本文详细解析 Claude Code 登录前的账号类型区分方法,涵盖个人订阅、Teams 席位与企业 Enterprise 席位的授权路径差异。提供终端登录命令、环境变量排查及常见异常处理步骤,帮助用户快速完成正确授权并避免登录路径混淆。

Claude Code 文件修改前的权限模式配置与命令审批指南
AI教程 · 2026-09-01

Claude Code 文件修改前的权限模式配置与命令审批指南

本文详细介绍Claude Code在修改文件前的权限模式配置方法,包括defaultMode可选值、permissions allow与deny规则设置、多层级配置文件管理以及 status验证技巧,帮助开发者安全高效地使用AI编程助手。

Claude Code接入VS Code后先测扩展和终端命令
AI教程 · 2026-09-01

Claude Code接入VS Code后先测扩展和终端命令

在VS Code中接入Claude Code后,建议优先验证扩展面板与集成终端两条入口。本文提供标准检查顺序、关键命令与常见故障排查路径,帮助你快速确认环境就绪,避免后续开发受阻。