ALS算法全称为交替最小二乘法(Alternating Least Squares),是一种基于协同过滤思想的矩阵分解算法。其亮点之一就在于优化参数时使用了交替最小二乘法,而非梯度下降算法,使得ALS算法可以进行分布式并行计算,因此其被收录于Spark的Mlib以及ML库中。下面将详细介绍这一算法:
一、核心思想
通过隐含特征(latent factor)联系用户兴趣和物品(item), 基于用户的行为找出潜在的主题和分类, 然后对item进行自动聚类,划分到不同类别/主题(用户的兴趣)。
本质是把协同过滤算法进行了一种延伸, 把用户的相似性和物品的相似性通过了一个叫做隐向量的方式进行表达
矩阵分解算法将 m × n m×n m×n 维的共现矩阵 R R R 分解成 m × k m×k m×k 维的用户矩阵 U U U 和 k × n k×n k×n 维的物品矩阵 M M M 相乘的形式。 我们的目标就是填充共现矩阵中的空缺值,从而对用户的行为产生预测。
其中 m m m 是用户数量, n n n 是物品数量, k k k 是隐向量维度, 也就是隐含特征个数, 只不过这里的隐含特征变得不可解释了, 即我们不知道具体含义了, 要模型自己去学。 k k k 的大小决定了隐向量表达能力的强弱, k k k 越大, 表达信息就越强, 理解起来就是把用户的兴趣和物品的分类划分的越具体。
每个用户和物品都有一个 k k k维的隐向量来表示,因此如果我们想计算某个用户对特定物品的评分或其他隐式行为 p i j p_{ij} pij,只需要计算对应向量的内积即可。
p i j = U i T M j = < u i , m j > p_{ij}=U_i^TM_j=<u_i,m_j> pij=UiTMj=<ui,mj>
二、代价函数
显示反馈代价函数
对于有交互行为的用户和物品来说,其评分偏差就是 r − p r-p r−p,我们采用平方损失函数,所以对于单个样本来说: L ( r , u , m ) = ( r − p ) 2 = ( r − < u , m > ) 2 L(r,u,m)=(r-p)^2=(r-<u,m>)^2 L(r,u,m)=(r−p)2=(r−<u,m>)2因此,整个样本上的损失函数为: L ( R , U , M ) = s u m ( i , j ) ∈ I L ( r i j , u i , m j ) L(R,U,M)=sum_{(i,j)\in I}L(r_{ij},u_i,m_j) L(R,U,M)=sum(i,j)∈IL(rij,ui,mj)其中 I I I 为用户和物品发生过交互行为的集合。
我们的目的是使得该损失函数最小,因此得到目标函数: ( U , M ) = a r g min ( U , M ) L ( R , U , M ) (U,M)=arg\ \min_{(U,M)}L(R,U,M) (U,M)=arg (U,M)minL(R,U,M)
当我们隐向量维度 k k k 设置的较大时,有可能会造成模型的过拟合,因此我们需要加入正则项对模型的参数进行惩罚(原论文使用的为Tikhonov正则化,我们为了简化计算使用L2正则化),因此损失函数就变成了: L λ r e g ( R , U ,