PageRank网页排序算法

1,定义

将整个互联网视为一个巨大的有向图G=(V,E),网页构成有向图的节点,网页间的超链接构成有向图的边,据此构建一个随机游走模型,即一阶马尔可夫链1

在这个模型中,为每个网页设定一个初始化的PageRank值,表示用户停留在该网页的概率,网页浏览者会随机地、按照等概率地跟随一个页面上的任何一个超链接到另一个页面,并持续这种随机跳转

在长时间内,这种随机跳转的行为会形成一个稳定的模式(马尔可夫链的平稳分布),每个网页的 PageRank 值,即用户停留在每个网页的概率收敛到一个稳定值。

直观上,如果指向网页i的超链接越多、能跳转到网页i的上游网页jPageRank越高,随机跳转到网页i的概率也就越高,网页iPageRank值就越高,网页也就越重要2

2,数学表示

有向图的状态转移矩阵定义为M=[mi,j]n×n,其中mi,j表示M的第i行第j列,也即节点j转移到节点i的概率,M具有如下性质:

image-20240403154343674

图示3节点转移关系的状态转移矩阵可以表示为

M=[012131001300000012130]

定义t时刻所有节点的PageRank值为向量Rt=[rti]n,其中rti表示t时刻停留在节点i的概率,满足irti=1,0时刻的状态分布向量初始化为M0=[1n]n,则t+k时刻的状态分布向量

Rt+k=MkRt

当经过足够长时间,上述随机游走过程达到马尔可夫链的平稳分布,Rt收敛至R

R=limtMtR0

此时由于状态已经收敛,满足

R=MR

要保证上述马尔可夫过程具有稳态分布,需要满足以下条件

由节点间链接指向关系构成的随机游走过程不一定同时满足上述三个条件,即不保证存在平稳状态。对此引入常数矩阵E/n,其中En×n全1矩阵,状态转移过程更新为

Rt+k=(dM+(1d)En)kRt

其中d(0d1)为阻尼因子,表示为节点以d的概率按照链接跳转,以(1d)的概率任意跳转。

3,数值求解

迭代求解

利用迭代公式Rt+k=(dM+(1d)En)kRt迭代求解,直至Rt趋于稳定,求解代码如下

代数求解

当经过足够长时间,达到马尔可夫链的平稳分布,Rt收敛至R时,满足

R=(dM+(1d)En)R=dMR+(1d)1n=(IdM)1(1d)1n

其中ER=[jRj]n=[1]n=1为全1列向量,In×n单位矩。上述方法求解代码如下

MapReduce方式求解

根据迭代公式

Rt+k=(dM+(1d)En)kRt

可知对于t+1时刻的节点i,其PageRank值为

rit+1=dM[i,:]Rt+(1d)n=djm(i)rjtL(v(j))+1dn

其中m(i)为存在指向节点i的节点的集合,v(i)为节点i指向节点的集合。

t时刻,节点i需要汇集在t1时刻所有指向i的节点jm(i)PageRank值,用于更新it时刻的PageRank值,同时也需要向所有i 节点指向的节点kv(i)分发iPageRank值,用于t+1时刻节点k更新PageRank值。

整个计算过程可以拆分为MapReduce两个过程,利用分布式计算框架迭代更新,由于互联网网页数量是万亿级的数字,由于上述的迭代解法和代数解法需要在单机上运行,将无法处理万亿级数据,MapReduce方法则可以解决单机计算的性能瓶颈问题。

Map过程接收节点j的编号、PageRank值和节点j指向节点集合v(j)为输入,向可跳转节点i传递当前在j节点时,下一时刻游走到i节点的条件概率P(i|j),用于更新t+1时刻iPageRank值,完成节点j向可跳转节点的随机游走过程。同时向节点j本身传递t时刻的PageRank值和v(j),用于判断jt+1时刻更新后PageRank值是否收敛。

Reduce过程按照节点编号i汇集所有指向他的节点jm(i)的条件概率P(i|j),更新t+1时刻的PageRank值,并判断是否收敛,同时向下传递节点i编号,v(i)PageRank,用于下一轮MapReduce过程。

整个过程的伪代码如下

以下使用mrjob包完成MapReduce计算任务实现,完整代码可见PageRank

4,验证

考虑一个n=8个节点构成有向图,转移矩阵初始化为

M=[0001000000010000001200001212120000000131300013001200120000100000000000000]

阻滞因子d=0.85,状态分布向量初始化R0=[1/8]8

迭代法和代数求解可以快速得到结果,并且代数求解可以获得最佳结果,但相较于其他方法,矩阵求逆时间复杂度较高,并且迭代法和代数求解只能在单机上运行,可运算数据规模受限。

MapReduce法求解时,由于每轮Map过程和 Reduce过程都涉及1次文件读写以及对象序列化和反序列化,且无法实现矩阵并行化计算,计算耗时最长,但是可以利用多机并行计算不受单机节点性能限制。

5,思考

通过上一小结发现MapReduce方式由于无法实现矩阵并行化计算,是性能较差的主要原因之一。观察公式

Rt+1=(dM+(1d)En)Rt=dMRt+(1d)1n

可以发现,迭代过程的矩阵运算可以分块进行。将上述表达式简化为Y=MR+B,考虑将M划分为p×q个子阵,横向分割线下标为[i1,i2,...,ip],纵向分割线下标为[j1,j2,...,jq],同样将RB划分为q个子阵,横向分割线下标为[j1,j2,...,jq]Y划分为p个子阵列,横向分割线下标为[i1,i2,...,ip]Y的第i个子阵可以表示为

Y<i>=j=1qM<i,j>R<j>+B<i>,

通过计算任务的拆分,将子阵分发到不同计算节点上,可以将大尺度矩阵运算切分为多个MapReduce小尺度矩阵运算子任务,将循环迭代计算替换为矩阵并行计算,缩短运算时间。以下为分块运算正确性验证,具体MapReduce任务待实现。

6,代码结构

完整代码可见PageRank

7,引用