综述
对于推荐场景,我们总可以列出一张表,每行表示一个用户,每列表示一个物品。对于这张表,每个位置表示用户对物品的评价。一般情况下,这张表是稀疏的,如何根据这张稀疏表已有的信息去填满未知的位置是推荐系统的一个研究方向。主流的做法是利用矩阵分解,将用户物品评分矩阵分解成两个矩阵的乘积,如果这两个矩阵的乘积能够拟合已有位置,则未知位置就可以根据这两个矩阵的乘积得到。
矩阵分解
矩阵分解方法是将用户物品评价矩阵$A_{m\times n}$分解成两个小矩阵,即:
可以将$P_{k\times m}$的每一列看作是用户的隐含特征向量,$Q_{k\times n}$的每一列看作是物品的隐含特征向量,使用下面的目标函数来训练这两个矩阵:
只使用$A_{i,j}$有值的项计算目标函数。
带偏置项的矩阵分解
很多时候每个用户自身存在一些偏好,每个物品本身也存在一些个性属性,同时每个用户在评价上的指标也会不同。比如一个用户认为10分满分给6分算一般而另一个用户却认为10分满分给3分算一般给6分算高分,再比如一个用户是体育迷所以给体育类物品评价很高等等。基于上述情况,可以先计算出一个整体平均评价作为一个评价基准,对每个用户和每个物品设置一个偏置项作为个性属性,所以有目标函数如下:
其中,$\mu$是平均评价,$b_i$和$b_j$分别对应用户和物品的偏置项。
SVD++
在上述两种方法中,对于一个用户对一个物品的评价的计算没有使用到该用户历史行为的影响,所以我们可以添加一项$w_{i,j}$表示用户$i$对物品$j$的评价对用户$i$后续评价的影响。同样的,对于$w_{i,j}$,我们分解成:
所以目标函数为:
其中$|N(i)|$表示用户$i$历史行为的数量,除以这一项是为了去除不同用户历史行为数量不一致所带来的影响。一般而言,$p_i$和$x_i$使用同一个向量,所以有:
优缺点
矩阵分解的方法容易实现,效果较好,还有一些扩展性。对于一些大型推荐系统,可能里面存在一些非线性的关系,这时候一些深度学习的方法可能会更好。