假设我们有一个评分矩阵,我们希望通过交替优化用户矩阵和物品矩阵来最小化误差。
假设:
- 我们有一个评分矩阵 ( 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 的计算过程!