SimRank是基于图论的,如果用于推荐算法,则它假设用户和物品在空间中形成了一张图。而这张图是一个二部图。所谓二部图就是图中的节点可以分成两个子集,而图中任意一条边的两个端点分别来源于这两个子集。一个二部图的例子如下图。从图中也可以看出,二部图的子集内部没有边连接。对于我们的推荐算法中的SimRank,则二部图中的两个子集可以是用户子集和物品子集。而用户和物品之间的一些评分数据则构成了我们的二部图的边。
对于用户和物品构成的二部图,如何进行推荐呢? SimRank算法的思想是,如果两个用户相似,则与这两个用户相关联的物品也类似;如果两个物品类 似,则与这两个物品相关联的用户也类似。如果回到上面的二部图,假设上面的节点代表用户子集,而下面节点代表物品子集。如果用户1和3类似,那么我们可 以说和它们分别相连的物品 2 和4也类似 。 如果我们的二部图是 $G(V, E)$ ,其中 $\mathrm{V}$ 是节点集合,是边集合。则某一个子集内两个点的相似度 $s(a, b)$ 可以用和相关联的另一个子集节点之间相似度 表示。即: $$ s(a, b)=\frac{C}{|I(a)||I(b)|} \sum_{i=1}^{|I(a)||I(b)|} \sum_{j=1} s\left(I_i(a), I_j(b)\right) $$ 其中C是一个常数,而 $I(a), I(b)$ 分别代表和 $\mathrm{a}$ , b相连的二部图另一个子集的节点集合。 $s\left(I_i(a), I_i(b)\right)$ 即为相连的二部图另一个子集节点之间的相似 度。 一种特殊情况是,自己和自己的相似度,我们定义为 1 。即 $s(a, a)=1$ 。还有一种特殊情况是 $I(a), I(b)$ 有一个为空,即 $\mathrm{a}$ , $\mathrm{b}$ 中某一个点没有相连的 另一个子集中的点,此时 $s(a, b)=0$ ,将这几种情况综合下,则二部图一个子集内两个点的相似度 $s(a, b)$ 可以表示为: $$ s(a, b)= \begin{cases}1 & a=b \\ \frac{C}{|I(a)||I(b)|} \sum_{i=1}^{|I(a)||I(b)|} \sum_{j=1} s\left(I_i(a), I_j(b)\right) & a \neq b, I(a) \neq \emptyset, I(a) \neq \\ 0 & \text { otherwise }\end{cases} $$ 如果我们想用上式直接计算两个物品或者两个用户之间的相似度是比较困难的,一般需要通过迭代方式计算。对于 $a \neq b, I(a) \neq \emptyset, I(a) \neq \emptyset$ 时,我 们注意到: $$ s(a, b)=\frac{C}{|I(a)||I(b)|} \sum_{i=1}^{|I(a)||I(b)|} \sum_{j=1}^N s\left(I_i(a), I_j(b)\right)=\frac{C}{|I(a)||I(b)|} \sum_{i=1}^N \sum_{j=1}^N p_{i a} s(a, b) p_{j b} $$ 其中 $\mathrm{p}$ 为二部图关联边的权重,而 $\mathrm{N}$ 为二部图节点数。
其中 $\mathrm{p}$ 为二部图关联边的权重,而 $\mathrm{N}$ 为二部图节点数。 上面的式子可以继续转化为: $$ s(a, b)=C \sum_{i=1}^N \sum_{j=1}^N\left(\frac{p_{i a}}{\sum_{i=1}^N p_{i a}}\right) s(a, b)\left(\frac{p_{j b}}{\sum_{j=1}^N p_{j b}}\right) $$ 如果用矩阵表示,则相似度矩阵 $S=C W^T S W$ ,其中 $W$ 是将权重值p构成的矩阵 $P$ 归一化后的矩阵。 但是由于节点和自己的相似度为 1 ,即我们的矩阵S的对角线上的值都应该改为 1 ,那么我们可以去掉对角线上的值,再加上单位矩阵,得到对角线为 1 的 相似度矩阵。即: $$ S=C W^T S W+I-\operatorname{Diag}\left(\operatorname{diag}\left(C W^T S W\right)\right) $$ 其中 $\operatorname{diag}\left(C W^T S W\right)$ 是矩阵 $C W^T S W$ 的对角线元素构成的向量,而 $\operatorname{Diag}\left(\operatorname{diag}\left(C W^T S W\right)\right)$ 将这个向量构成对角矩阵。 只要我们对S矩阵按照上式进行若干轮迭代,当S矩阵的值基本稳定后我们就得到了二部图的相似度矩阵,进而可以利用用户与用户的相似度度量,物品 与物品的相似度度量进行有针对性的推荐。
现在我们对SimRank算法流程做一个总结。 输入: 二部图对应的转移矩阵 $\mathrm{W}$ ,阻尼常数C,最大迭代次数 $\mathrm{k}$ 输出: 子集相似度矩阵S:
由于SimRank算法涉及矩阵运算,如果用户和物品量非常大,则对应的计算量是非常大的。如果直接用我们第二节讲到了迭代方法去求解,所花的时间 会很长。对于这个问题,除了传统的一些SimRank求解优化以外,常用的有两种方法来加快求解速度。 第一种是利用大数据平台并行化,即利用Hadoop的MapReduce或者Spark来将矩阵运算并行化,加速算法的求解。 第二种是利用蒙特卡罗法(Monte Carlo,MC)模拟,将两结点间 SimRank 的相似度表示为两个随机游走者分别从结点 a和 b出发到最后相遇的总时间 的期望函数。用这种方法时间复杂度会大大降低,但是由于MC带有一定的随机性,因此求解得到的结果的精度可能不高。
作为基于图论的推荐算法,目前SimRank算法在广告推荐投放上使用很广泛。而图论作为一种非常好的建模工具,在很多算法领域都有广泛的应用,比 如我之前讲到了谱聚类算法。同时,如果你理解了SimRank,那么Google的PageRank对你来说就更容易理解了。
个人理解PageRank只能得到某一个节点自己的权重,而SimRank却可以得到两两之间的权重度量,明显SimRank要更加高大上。)
转载自: