关于推荐系统,如果在忘掉所有的公式和代码,忘记所有的语言描述,脑海里就剩下几张图景,会是什么?一张二维表格,一个拓扑图,一条时间线。这三幅图景,是我看待推荐算法的三种视角。
在脑中想象一个二维的表格,每一行代表一个用户,每一列代表一个物品,表格里的每一个点代表用户对物品的操作,这个操作可以是评分,点击,点赞。其中,有些格子记录了行为,有些格子是空的。到这里,我们就建立了基本的矩阵视角,推荐问题转化成了如何补上那些空格子。
用户对物品的评分等于相似用户对该物品评分的加权平均值,这就是user-base的协同过滤了。换一个方向,用户对物品的评分等于该用户对其他物品的评分按物品相似加权平均值,这就是item-base的协同过滤。度量用户之间的相似度,把矩阵的一行——对物品的评分向量作为该用户的表示向量,那么用户之间可以计算向量的距离,可以选择任何距离公式,如余弦距离,皮尔森距离。对于物品之间的相似度,换一个方向即可。
对于任何两个物品,可以计算它们的评分差值。具体来说,两个物品有一批共同的历史评分用户,也就是矩阵里两列有交集的行,每一行可以计算一个差值,将差值平均起来,作为两个物品的距离。和上面的距离不同的,这个差值可以想象成物理中的位移,带着符号的。推荐时,某用户对于某个物品的评分,等于某用户对其他物品评分加上这个位移,再进行平均得到的平均评分。和上面的item-base一样的,都是列向量计算相似度,只不过相似度由距离变成了位移。这就是著名的Slope-One算法。
物品直接的相似度,除了上面的启发式