说到推荐系统,可能最为人熟知的算法就是协同过滤,特别是其中的 ItemCF,自亚马逊文章发表以后,得到了广泛而成功的应用。这篇文章主要谈谈我的理解。
ItemCF 推导过程
首先,ItemCF 依赖一个隐含的假设:就是每个用户的兴趣都局限在某几个方面,因此如果两个物品属于一个用户的兴趣列表,那么这两个物品可能就属于有限的几个领域,而如果两个物品属于很多用户的兴趣列表,那么它们就可能属于同一个领域,因而有很大的相似度。
从这个假设出发,我们可以认为两个视频相似表现在它们被很多用户同时观看,两个物品共同观看的人数越多,说明它们的相似度越高,用公式来表达就是:
其中,$N(i)$ 表示观看视频 $i$ 的人群集合,$|N(i)\cap N(j)|$ 表示同时播放过 $i,j$ 的人数。但是由于热点视频可能并不代表用户的真实兴趣(有可能是运营推送,或者仅仅是由于追热心理),因此需要惩罚那些热点的视频,可以通过将共同观看人数除以与视频总观看数相关的系数来实现,例如使用以下方式:
但是仅仅惩罚热点视频也还不够,有些人就是闲的无聊,有什么看什么,这种情况下他表现出来的就未必是真实的兴趣了(就不满足我们的隐含假设),他的行为也就不太能作为我们的协同的依据,因此需要对这种人做降权,例如使用以下方式:
其中,$M(u)$ 表示用户 $u$ 观看的视频集合。另外,如果用户对视频 $i$ 观看了 80%,而对视频 $j$ 只看了 10%,那用户对这两个视频的喜欢程度也是不相同的,因此我们还可以对用户对两个视频观看的完成度差异做降权,差异越大,相似度也越低,例如使用以下方式:
其中,$r_u(i)$ 表示用户 $u$ 对视频 $i$ 的观看完成度。最后,将所有视频与其他视频的相似度做 $max$ 归一化,得到:
归一化使得所有物品的相似度取值都在 (0,1] 之间,这个相似度已经可以直接用于相关推荐场景。另外,有研究表明,这种归一化可以提高 ItemCF 用于个性化推荐时的准确度、覆盖率和多样性。
那基于 ItemCF 如何进行个性化推荐呢?主要是考虑推荐与用户的观看历史最相似的视频,即计算每个视频与用户观看视频集合的相似度作为作为是否观看该视频的预测值:
最后,再根据预测值从大到小选取 TopN 个视频作为推荐结果。
优化与讨论
其实从第 1 部分的介绍来看,基于 ItemCF 的思想可以做很多改进。例如:
- 如果感觉算出来的结果仍然偏向热门视频时,可以增加式 (4) 的分母大小;
- 如果觉得用户只有观看完完成度很高时才是真实兴趣,那可以将式 (4) 的 $cos(\cdot)$ 部分改成类似 $r_u(i)\cdot r_u(j)$ 的形式;
- 如果觉得需要更多的考虑用户的短期兴趣,做即时的推荐,那可以将式 (6) 中的用户观看历史限制在最近几次,甚至一次;
如果把用户-视频考虑成一个二部图,ItemCF 实际上是基于图的结构,执行了一次从用户到视频的兴趣扩散过程。可以考虑下图中的视频 $v_1,v_3$,它们没有直接的共同观看,因此用 ItemCF 算出来的相似度为 0,但是实际上 $u_1,u_2$ 都观看了 $v_2$,因此可以认为用户 $u_1,u_2$ 存在一定的相似性,因此如果执行一次视频-用户-视频的兴趣扩散过程就能够捕获 $v_1,v_3$ 的相似度了。
后面一种思路实际上就是 SimRank,但是由于需要执行多次兴趣扩散(即对二部图做多次迭代计算),SimRank 的计算复杂度相当高,在业务数据量大的情况下需要强大的算力支持,以后会再讨论下我在 SimRank 模型上的尝试。