交替最小二乘法(ALS)的工作原理

server/2024/10/17 20:58:18/

假设我们有一个评分矩阵,我们希望通过交替优化用户矩阵和物品矩阵来最小化误差。

假设:

  • 我们有一个评分矩阵 ( R ),它的维度是 ( m \times n ),即 ( m ) 个用户和 ( n ) 个物品(比如电影、商品等)。
  • 矩阵分解目标:我们想将这个矩阵分解成两个较小的矩阵:
    • 用户特征矩阵 ( U )(维度为 ( m \times k ),每个用户有 ( k ) 个特征)
    • 物品特征矩阵 ( V )(维度为 ( n \times k ),每个物品有 ( k ) 个特征)
  • 目标是找到 ( U ) 和 ( V ) 使得它们的乘积 ( UV^T ) 尽可能接近原始评分矩阵 ( R )。

第一步:定义误差

首先,定义预测矩阵为 ( \hat{R} = UV^T )。我们的目标是最小化这个预测矩阵 ( \hat{R} ) 和实际评分矩阵 ( R ) 之间的误差。

误差可以表示为:
[ E = \sum_{(i,j) \in K} (R_{ij} - U_i V_jT)2 ]
其中:

  • ( E ) 是总的平方误差。
  • ( R_{ij} ) 是用户 ( i ) 对物品 ( j ) 的评分。
  • ( U_i ) 是用户 ( i ) 的特征向量(大小为 ( 1 \times k ))。
  • ( V_j ) 是物品 ( j ) 的特征向量(大小为 ( 1 \times k ))。
  • ( K ) 是包含用户对物品评分的所有索引集(即,已知评分的用户-物品对)。

我们希望通过优化 ( U ) 和 ( V ) 来最小化这个误差。

第二步:固定物品矩阵 ( V ),优化用户矩阵 ( U )

首先,我们固定物品特征矩阵 ( V ),然后根据评分矩阵 ( R ) 优化用户特征矩阵 ( U )。

对每个用户 ( i ),我们的目标是通过最小化以下的平方误差来计算 ( U_i ):
[ E = \sum_{j \in K_i} (R_{ij} - U_i V_jT)2 + \lambda | U_i |^2 ]

其中:

  • ( K_i ) 是用户 ( i ) 给物品打过分的物品集合。
  • ( \lambda ) 是正则化参数,用来防止过拟合(类似于加了惩罚项)。

为了最小化这个误差,我们可以用最小二乘法来求解 ( U_i ) 的最优值。实际上,这是一个线性回归问题。我们可以把它写成一个矩阵形式的方程:

[ U_i = (V_{K_i}^T V_{K_i} + \lambda I)^{-1} V_{K_i}^T R_i ]

其中:

  • ( V_{K_i} ) 是物品特征矩阵中用户 ( i ) 打过分的物品行的子矩阵。
  • ( R_i ) 是用户 ( i ) 的评分向量。
  • ( I ) 是单位矩阵。

通过这一步,我们可以得到所有用户的特征向量 ( U_i )。

第三步:固定用户矩阵 ( U ),优化物品矩阵 ( V )

接下来,我们固定用户特征矩阵 ( U ),对物品特征矩阵 ( V ) 进行优化。这一步的计算过程与第二步类似,只是换成了物品的特征向量。

对每个物品 ( j ),我们最小化以下误差:
[ E = \sum_{i \in K_j} (R_{ij} - U_i V_jT)2 + \lambda | V_j |^2 ]

这里的 ( K_j ) 是打过分的用户集合,表示哪些用户对物品 ( j ) 进行了评分。

同样,使用最小二乘法,我们可以得到物品特征矩阵 ( V_j ) 的更新公式:
[ V_j = (U_{K_j}^T U_{K_j} + \lambda I)^{-1} U_{K_j}^T R_j ]

其中:

  • ( U_{K_j} ) 是用户特征矩阵中打过物品 ( j ) 的用户行的子矩阵。
  • ( R_j ) 是物品 ( j ) 的评分向量。

通过这一步,我们可以得到所有物品的特征向量 ( V_j )。

第四步:反复交替更新,直到收敛

上述的两个步骤(优化 ( U ) 和优化 ( V ))反复进行。每次更新用户矩阵 ( U ) 后,再更新物品矩阵 ( V ),直到误差不再显著减少,也就是收敛。

总结:

  • 步骤 1:初始化用户矩阵 ( U ) 和物品矩阵 ( V ),通常是随机初始化。
  • 步骤 2:固定物品矩阵 ( V ),用最小二乘法计算用户矩阵 ( U )。
  • 步骤 3:固定用户矩阵 ( U ),用最小二乘法计算物品矩阵 ( V )。
  • 步骤 4:反复交替更新,直到平方误差收敛(即误差不再明显减小)。

通过这些步骤,ALS 可以找到合适的用户和物品的特征向量,从而预测用户对未评分物品的评分。

希望这些计算步骤能帮助你更好地理解 ALS 的计算过程!


http://www.ppmy.cn/server/131743.html

相关文章

CSS常用声明(属性)

目录 一、文本 1、字体属性 2、文本修饰 二、图像 1、图像边框样式 2、图像透明度 三、背景 1、background-color:背景颜色 2、background-img:背景图像 3、背景展示效果 4、background-size:背景图大小 5、background-position&…

Vue3 watch 监视属性

作用:监视数据的变化(和Vue2中的watch作用一致)特点:Vue3中的watch只能监视以下四种数据: ref定义的数据。reactive定义的数据。函数返回一个值(getter函数)。一个包含上述内容的数组。 我们在V…

Redis 数据类型list(列表)

目录 1 基本特性 2 主要操作命令 2.1 LPUSH key value [value ...] 2.2 RPUSH key value [value ...] 2.3 LRANGE key start stop 2.4 LINDEX key index 2.5 LLEN key 2.6 LPOP key 2.7 RPOP key 2.8 LTRIM key start stop 2.9 BLPOP key [key ...] timeout 2.10 B…

computed和watch的区别

一、computed(计算属性) 1. 定义 计算属性是基于 Vue 实例的响应式数据进行计算的属性。它们的值会根据依赖的数据变化而自动更新,并且会被缓存,只有当其依赖的数据发生变化时才会重新计算。 2. 使用场景 衍生状态&#xff1a…

从零开始:用Python编写自己的简单游戏

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在编程的世界里,游戏开发一直是一个既充满乐趣又具有挑战性的领域。很多著名的游戏开发者在年轻时编写了他们的第一个简单游戏,点燃了他们的编程热情。在本文中,我们将带领你使用Python编写一个基础的2D游戏,…

docker简述

1.安装dockers,配置docker软件仓库 安装,可能需要开代理,这里我提前使用了下好的包安装 启动docker systemctl enable --now docker查看是否安装成功 2.简单命令 拉取镜像,也可以提前下载使用以下命令上传 docker load -i imag…

Leetcode 不同路径

重要的一点在于:只能向右或向下移动。 这段代码的算法思想是使用**动态规划(Dynamic Programming, DP)**来解决问题。其核心思想是通过将问题分解成更小的子问题,并用一个二维数组来保存这些子问题的解,从而避免重复计…

FFmpeg的简单使用【Windows】--- 视频混剪+添加背景音乐

一、功能描述 点击背景音乐区域的【选择文件】按钮,选择音频文件并将其上传到服务器,上传成功后会将其存储的位置路径返回。 然后,点击要处理视频区域的【选择文件】按钮选择要进行混剪的视频素材(1-10个)。 以上两…