# PageRank

在理解 pagerank 算法之前需要理解 Markov chain。可以说 PageRank 的核心就是 Markov 算法,PageRank 的执行过程、收敛条件都可以从 Markov 中得到答案。

# Markov chain

# 基本定义

马尔科夫性:未来只依赖现在(假设现在已知),而与过去无关。

一阶马尔科夫链:

P(XtX0,X1,,Xt1)=P(XtXt1)t=1,2,P(X_t| X_0,X_1,\cdots ,X_{t-1}) = P(X_t| X_{t-1})\quad t=1,2,\cdots

其中 $P (X_t| X_0,X_1,\cdots ,X_{t-1}) $ ,表示在 $X_0,X_1,\cdots ,X_{t-1} 发生的情况下,发生的情况下,X_t发生的条件概率,而这个条件概率又与发生的条件概率,而这个条件概率又与 P (X_t| X_{t-1})$ 相等,说明XtX_t 的概率只由Xt1X_{t-1} 决定。这就是未来只依赖现在(假设现在已知),而与过去无关。

n 阶马尔科夫链:

P(XtX0,X1,,Xt1)=P(XtXtnXt1)t=1,2,P(X_t| X_0,X_1,\cdots ,X_{t-1}) = P(X_t|X_{t-n}\cdots X_{t-1})\quad t=1,2,\cdots

# 转移矩阵

马尔科夫链在 t-1 时刻处于 j 状态,那么时刻 t 转移到 i 状态的概率可以记作:

Pij=(Xt=iXt1=j)P_{ij} = (X_t = i| X_{t-1} =j)

马尔科夫链的转移概率就可以用转移矩阵表示为 P。

马尔科夫链在 t 时刻的状态分布可以记作

π(t)=[π1(t),π2(t),]T\pi(t) = [\pi_1(t),\pi_2(t),\cdots]^T

πi(t)\pi_i(t) 表示 t 时刻处于 i 状态的概率。

这块如果有疑虑可以查阅资料。

# 平稳分布

Pπ=πP \pi = \pi

此时 $\pi $ 就是平稳分布。意思是,状态向量π\pi 无法再通过状态转移 P,到达新的状态分布,则表示马尔科夫链已经到达收敛。

不可约、非周期且正常返的马尔科夫链有唯一的平稳分布

# PageRank 算法

# PageRank 定义

传统的 web 结构中,都是通过网页之间互联(可以看做有向图)来实现访问。image-20210930100912529

如图所示,我们如何表示某个网页 s 的重要性呢?看有多少网页指向这个 s 网页。这个很好理解,那么重要的网页指向的网页肯定也是比较重要的。于是我们有了两个基本的关于网页 page 重要性的定义:

  • 被很多网页指向的那个网页,它的重要性一定很高。
  • 被很重要的网页指向的网页,那么它的重要性也应该高。

# PageRank 算法的执行过程

# 初始化

我们先对每个 graph 节点的 rank 值做初始化,可以定义初始的分布向量r0=[1/n,1/n,]Tr_0 = [1/n,1/n,\cdots]^T

n 表示 graph 节点的总数,我们预定义所有节点的 rank 值相加要为 1,且初始相等。

# 迭代

做随机游走

image-20210930102017814

定义

rj=ijrididi节点i的出度r_j = \sum_{i\rightarrow j} \frac{r_i}{d_i}\\ d_i \cdots \text{节点i的出度}

整个过程可以写为:

rt+1=Mrtr_{t+1} = M \cdot r_t\\

M 是转移矩阵,如果 i、j 两个节点有边相连,那么 Mij 表示由 j 转移到 i 的概率,值就是 1/dj。dj 是节点 j 的出度

# 收敛

这是一个马尔科夫过程,最终会达到一个平稳分布,也就是收敛。

r=Mrr = M \cdot r

实际执行时,只需要满足

rtrt1<ϵ|r_t - r_{t-1} | < \epsilon

image-20210930104147282

# PageRank 算法的一般定义

# 问题

Spider trap

如果某个节点只有一条出边,且这条出边指向它自己。image-20210930104311723

那么最终该节点会吃掉所有节点的 rank 值。很好理解,如果 j 是这种节点,那么转移矩阵 M 的第 j 列只有 Mjj 为 1,其余值Mij=0ijM_{ij} =0 \quad i \neq j。每次MrM \cdot r 迭代时候,其他节点就吃不到 j 节点的 rank 值,因为它不转出,而 j 节点会一直吃到其他节点的 rank 值,因为存在Mjk0(kj)M_{jk} \neq 0 \quad(k \neq j)

image-20210930104815056

Dead Ends

同理节点 j 没有出边,只有入边:

image-20210930105051142

对应的转移矩阵 M 中第 j 列全为 0,那么每次迭代MrM \cdot r 时,没有任何一个节点(包括 j 节点自己)能吃到 j 的值。而其他节点还在给 j 节点输送 rank 值。

于是,每次迭代时候,

sum(r(t1))sum(r(t))=rj(t1)sum(r(t-1))- sum(r(t)) = r_{j}(t-1)

# 一般化

image-20210930105827697

定义一个转移系数β\beta,每次有1β1-\beta 的可能性跳转到其他节点

rj=ijβridi+(1β)1Nr=βMr+1βN1r_j = \sum_{i \rightarrow j} \beta \frac{r_i}{d_i} +(1-\beta)\frac{1}{N}\\ r = \beta Mr +\frac{1-\beta}{N} 1

以 dead end 为例子,假设 j 为 dead end。虽然刚开始也会有 rank 值的损失,但随着迭代的进行,只要满足下列式子就不会有 rank 值的减小。

iNri=βijNri+1β\sum_{i}^N r_i = \beta\sum_{i\neq j}^{N} r_i +1-\beta

随着迭代的进行,sum (r) 减小的幅度会逐渐变为 0。也就是说,一般化的 PageRank 算法也是可以收敛的。

假设转移矩阵为:

image-20210930112446664

初始的 r 为[1/4,1/4,1/4,1/4]T[1/4,1/4,1/4,1/4]^T

经历了 100 次迭代后,loss sum:

image-20210930112544742

# Personalized PageRank

image-20210930113020041

提出的问题就是怎么寻找两个节点之间的关联性。

比如对于节点 Q,如何查询和他最相似的节点?

image-20210930114027380

# 执行过程

image-20210930114052888

Q 连接到 user1,2,3。而不同的 user 对于 Q 的节点不一样,这就是一个转移概率

s=[0.3,0,0.3,0,0.4,0,0]s = [0.3,0,0.3,0,0.4,0,0] sum(s)=1

这个就是 Q 跳转到 user 的概率。

假设 Q 根据 weight 跳转到 User1,那么执行 random walk,随机跳转到其他的节点,每次访问了某个节点就将该节点的 count+1。同时进行随机 reset,重新回到节点 Q,再一次进行上述过程。

算法执行过程:

image-20210930114811529

统计最后哪个节点 count 数最多,就表示和节点 Q 最相似。

# matrix factorization

这一块不怎么熟悉,有待进一步学习。

更新于

请我喝[茶]~( ̄▽ ̄)~*

Kalice 微信支付

微信支付

Kalice 支付宝

支付宝