PageRank 算法
PageRank 最初作为互联网网页重要度的计算方法,由 Page 和 Brin 提出,并用于谷歌搜索引擎的网页排序。事实上,PageRank 可以定义在任意有向图中,所以也广泛用于社会影响力分析等其他领域。
本节的内容包括:
- PageRank 算法
- 个性化 PageRank 算法 (Personalized PageRank)
- 重启随机游走算法 (Random Walk with Restarts)
PageRank
PageRank 的定义
从直觉出发,要衡量一个网页的重要程度,可以有两个最基础的假设:
- 如果有很多网页都有链接指向该网页,那么可以认为该网页很重要
- 如果有很重要的网页指向该网页,那么该网页也很重要
如果把网页看作节点,网页之间的链接看作边,那么众多网页可以看作是一个有向图,用
r
r
r 表示节点的 Rank 值,
r
r
r 越大,表示节点越重要。节点
j
j
j 的 Rank 值取决于指向于它的邻接节点的重要性:
r
j
=
∑
i
→
j
r
i
d
i
r_j = \sum_{i \rightarrow j} \frac {r_i}{d_i}
rj=i→j∑diri
其中
i
→
j
i \rightarrow j
i→j 表示存在由节点
i
i
i 指向节点
j
j
j 的边,
d
i
d_i
di 表示节点
i
i
i 连出边的数量。为了把上式写成矩阵形式,定义随机邻接矩阵(stochastic adjacency matrix)
M
i
j
=
1
d
j
,
if
j
→
j
M_{ij} = \frac {1}{d_j}, \quad \text{if} \ j \rightarrow j
Mij=dj1,if j→j
所有节点的 Rank 值组成 Rank 向量
r
\mathbf r
r ,并且
∑
i
r
i
=
1
\sum_i r_i = 1
∑iri=1,那么 Rank 向量满足以下公式
r
=
M
r
\mathbf r = \mathbf M \mathbf r
r=Mr
PageRank 的解法
迭代法
根据公式 r = M r \mathbf r = \mathbf M \mathbf r r=Mr ,很容易想到可以通过不断迭代来计算 r \mathbf r r ,步骤为
- 初始化: r ( 0 ) = ( 1 N , . . . , 1 N ) \mathbf r^{(0)} = (\frac1N, ..., \frac1N) r(0)=(N1,...,N1)
- 迭代: r ( t + 1 ) = M r ( t ) \mathbf r^{(t+1)} = \mathbf M \mathbf r^{(t)} r(t+1)=Mr(t)
- 当 ∣ r ( t + 1 ) − r ( t ) ∣ < ε |\mathbf r^{(t+1)} - r^{(t)}| < \varepsilon ∣r(t+1)−r(t)∣<ε 时,停止计算
在迭代过程中,可能会出现局部多次循环陷阱 (下图左) 或者遇到某些节点只进不出 (下图右),这时需要引入一个参数 β \beta β 。以用户浏览网页为例,当用户在浏览网页时,我们假设他从当前网页的外链接中随机选择一个链接的概率为 β \beta β,而他选择所有网页中任意一个网页的概率为 1 − β 1-\beta 1−β ,也就是说用户在选择下一个网页时,可能会跳转到一个与当前网页完全不相关的网页。
PageRank 更一般的计算公式为
r
j
=
β
∑
i
→
j
r
i
d
i
+
(
1
−
β
)
1
N
r_j = \beta \sum_{i \rightarrow j} \frac {r_i}{d_i} + (1 - \beta) \frac 1N
rj=βi→j∑diri+(1−β)N1
对应的矩阵形式为
r
=
β
M
r
+
(
1
−
β
)
r
N
\mathbf r = \beta \mathbf M \mathbf r + (1 - \beta) \frac {\mathbf r} {N}
r=βMr+(1−β)Nr
定义
G
=
β
M
+
(
1
−
β
)
1
N
\mathbf G = \beta \mathbf M + (1 - \beta) \frac {\mathbf 1} {N}
G=βM+(1−β)N1
其中
1
\mathbf 1
1 表示成员都是1的
N
N
N 维向量, PageRank 方程可以写为
r
=
G
r
\mathbf r = \mathbf G \mathbf r
r=Gr
个性化 PageRank
个性化 PageRank 算法的目标是计算节点对某些特定节点的相关度,这需要通过重启随机游走算法来完成。所谓重启随机游走,就是给定一个需要查询的节点结合 S = { Q 1 , Q 2 , . . . , Q k } S = \{Q_1, Q_2, ..., Q_k\} S={Q1,Q2,...,Qk} ,每次游走起点都是从查询节点中随机(或者有不同权重)选择一个,在每次游走的时候都有一定概率 α \alpha α 会回到查询节点 S S S 中的一个节点,游走过程中需要记录访问每个节点的次数,最后次数最高的节点与查询节点的相关性最高。
如下图,上排圆形节点表示一系列商品,下派排方形节点表示用户,我们想通过用户与商品的链接关系来查询商品节点与节点 Q 的相关度。
具体做法如下: