当前位置: 首页 > news >正文

交替最小二乘法

前置概念导入

  1. 协同过滤(Collaborative Filtering):这是一种推荐系统的方法,依据用户之间或物品之间的相似性来进行推荐。协同过滤通常分为两种主要类型:用户基于(user-based)和物品基于(item-based)协同过滤。用户基于协同过滤关注于找出相似用户的偏好来推荐物品,而物品基于协同过滤则是通过比较物品之间的相似性来进行推荐。

  2. 矩阵分解(Matrix Factorization):这是协同过滤的一种实现方式,尤其用于处理用户-物品评分矩阵中的缺失数据。矩阵分解通过将大的用户-物品矩阵分解为用户潜在因子矩阵和物品潜在因子矩阵的乘积,以揭示用户和物品的潜在特征。矩阵分解使得系统能够预测未知评分,从而为用户提供个性化推荐。

交替最小二乘法

对矩阵进行分解,有很多种方式,比如奇异值分解(SVD),SVD++和交替最小二乘法(ALS)等,Spark MLlib中推荐算法使用的是ALS方式。

交替最小二乘法ALS(Alternating Least Squares, )是一种用于矩阵分解的优化算法,主要用于推荐系统中的协同过滤。其核心思想是通过迭代过程交替固定用户和物品的潜在因子,然后最小化实际观测到的评分与预测评分之间的差异。具体来说,ALS的思想可以分为以下几个步骤:

  1. 初始化:随机初始化用户矩阵U和物品矩阵V的潜在因子。

  2. 固定一个因子:在每次迭代中,先固定一个因子(例如,先固定用户因子U),只优化另一个因子(物品因子V)。

  3. 最小化误差:通过最小化观测到的评分和通过当前因子乘积预测的评分之间的误差来更新固定的因子。

  4. 交替优化:然后固定物品因子V,优化用户因子U。重复这个步骤直到收敛,即两者的更新不再导致总误差显著减少。

  5. 正则化:为了防止过拟合,在优化过程中通常会加入正则化项,以平衡模型的复杂度和训练数据的拟合程度。

  6. 收敛:当达到预设的迭代次数或者误差减少到一个阈值以下时,算法结束。

交替最小二乘法的一个关键优点是它能够有效地处理大规模、稀疏的数据集,并且易于并行化,这使得它特别适合分布式计算环境,如Apache Spark。此外,由于每次迭代中只固定一个因子,这简化了优化问题,使得每一步的计算都是一个简单的最小二乘问题,可以高效解决。

假设我们有以下的用户-物品评分矩阵,其中未知项用 "?" 表示:

用户\物品  物品1  物品2  物品3
用户A       5      ?      3
用户B       4      ?      ?
用户C       ?      2      4

我们想要分解这个矩阵为两个低秩矩阵(用户因子矩阵 U 和物品因子矩阵 V),假设我们选择的潜在因子的数量是 2。初始化 U 和 V 可能如下所示:

U (2x3) =   | ua1  ua2 |
                  | ub1  ub2 |
                  | uc1  uc2 |

V (2x3) =   | va1  va2  va3 |
                  | vb1  vb2  vb3 |

假定我们先固定物品因子 V,优化用户因子 U。对于用户A和物品3的组合,我们的目标是最小化实际评分(3)和预测评分(ua1 * va3 + ua2 * vb3)的误差。通过最小二乘法优化 ua1 和 ua2。

然后,我们固定用户因子 U,优化物品因子 V。同样地,我们要最小化实际评分和预测评分的误差,这一次是通过优化 va1, va2, va3, vb1, vb2, vb3。

假设经过一次迭代后,U 和 V 更新如下:

U (2x3) = | 0.9  1.1 |
                | 0.8  0.9 |
                | 1.0  0.8 |

V (2x3) =  | 1.2  0.9  1.3 |
                 | 1.1  1.0  1.2 |

接下来,我们会计算预测评分矩阵,目标是得到 U 和 V 的乘积,这个乘积能够近似原始的评分矩阵。当 U 和 V 的更新使得总误差不再显著减少,或者达到预设的迭代次数,或者误差减少到一个预设的阈值以下时,我们可以认为模型已经收敛,此时的 U 和 V 就是我们通过 ALS 算法得到的矩阵分解结果。这些结果可以用来预测缺失的评分,为用户提供推荐。在这个例子中,U 的每一行对应一个用户的潜在因子表示,而 V 的每一列对应一个物品的潜在因子表示。

http://www.lryc.cn/news/239443.html

相关文章:

  • 封面从这里取好啦
  • DM8共享集群DSC初始化DB实例报错
  • 大师学SwiftUI第18章Part1 - 图片选择器和相机
  • 【电子通识】USB3.0和USB2.0有什么区别?
  • 在VSCode创建vue项目,出现“因为在此系统上禁止运行脚本”问题
  • OpenCV快速入门:目标检测——轮廓检测、轮廓的距、点集拟合和二维码检测
  • 基于STM32的烟雾浓度检测报警仿真设计(仿真+程序+讲解视频)
  • Jenkins 下载安装
  • MySQL 事务的底层原理和 MVCC(二)
  • (C++)验证回文字符串
  • 代码随想录算法训练营第25天|216.组合总和III 17.电话号码的字母组合
  • Kotlin学习——hello kotlin 函数function 变量 类 + 泛型 + 继承
  • 打印lua输出日志
  • HTML新手入门笔记整理:HTML基本介绍
  • 梯度引导的分子生成扩散模型- GaUDI 评测
  • 2023 年 亚太赛 APMCM ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析
  • 如何用cmd命令快速搭建FTP服务
  • 数据结构学习笔记——多维数组、矩阵与广义表
  • C++之常用的排序算法
  • Mac中LaTex无法编译的问题
  • 【Python爬虫】8大模块md文档集合从0到scrapy高手,第7篇:selenium 数据提取详解
  • 【python基础(三)】操作列表:for循环、正确缩进、切片的使用、元组
  • 使用VSCode调试全志R128的C906 RISC-V核心
  • Node.js之http模块
  • golang 断点调试
  • 定时器如何计算触发频率?
  • 【数据库】数据库中的检查点Checkpoint,数据落盘的重要时刻
  • 关于 Docker
  • ​LeetCode解法汇总2342. 数位和相等数对的最大和
  • 数据库的级联删除