PageRank算法
PageRank的假设和思想
PageRank是由Larry Page和Sergey Brin在斯坦福大学开发的算法,最初用于Google搜索引擎来对网页进行排名。它基于一个重要假设:重要的页面往往会收到更多其他页面的链接。 正是因为这个重要的假设,使得PageRank算法对互联网网页的排序结果比当时其他网页搜索(例如Lycos)的结果相关度高很多。
PageRank算法背后的核心思想是:一个页面的重要性可以通过观察到达该页面的链接数量和质量来确定。
这个假设从直观上理解也是合理的
- 从链接数量来看,在很多情况下,一个页面的重要性确实可以通过它被其他页面的引用次数来衡量。这与学术出版物的引用机制类似,一篇经常被引用的论文通常认为具有较高的学术价值
- 从链接质量来看,如果一个权威页面链接到另一个页面,这种“信任”是有传递性的。这就像一个领域内的专家推荐另一个专家的工作,推荐本身就具有权威性。
因此,如果一个高质量的页面会有很多链接指向它,而且如果这些链接来自其他高质量的页面,那么该页面的PageRank值会更高。
原始PageRank算法步骤
由于计算一个结点PageRank值需要先计算周围结点的PageRank值,而计算周围结点的PageRank值又需要计算该结点的PageRank值,这类似与循环引用或者递归。因此,要先给每个图中的结点进行初始化,然后使用PageRank算法进行迭代。
初始化
每个页面的初始PageRank值设为 1 N \frac{1}{N} N1,其中 是网络中的页面总数。
迭代
对于每一次迭代,每个结点的PageRank值计算为
P
R
(
p
i
)
=
∑
p
j
∈
M
(
p
i
)
P
R
(
p
j
)
L
(
p
j
)
,
PR(p_i)=\sum_{p_j\in M(p_i)}\frac{PR(p_j)}{L(p_j)},
PR(pi)=pj∈M(pi)∑L(pj)PR(pj),
其中,
M
(
p
i
)
M(p_i)
M(pi)表示P的邻居(与p结点相连接的结点),
L
(
p
j
)
L(p_j)
L(pj) 是页面 j 的出链数量。
用自然语言描述为:一个结点的PageRank值等于把所有指向它的结点的PageRank (
P
R
(
p
j
)
PR(p_j)
PR(pj))值除以指向它的结点的出度(
L
(
p
j
)
L(p_j)
L(pj)) 的 相加 (
∑
p
j
∈
M
(
p
i
)
\sum_{p_j\in M(p_i)}
∑pj∈M(pi)
结束)
通过不断迭代PageRank值,直到所有页面的PageRank值收敛,即变化非常小或达到预设的迭代次数。
例子
如图所示,对于结点
j
j
j ,指向
j
j
j的结点有: 结点
i
i
i 和结点
k
k
k ,而结点
i
i
i 出度为3,结点
k
k
k 的出度为4,因此结点
j
j
j 的PageRank值为
r
j
=
r
i
/
3
+
r
k
/
4
,
r_j=r_i/3+r_k/4,
rj=ri/3+rk/4, ,其中
r
j
r_j
rj表示结点
j
j
j的PageRank值。
问题
原始PageRank算法可以表示大部分网页的重要度,但是这种算法存在一些问题
- 排名泄漏 : 如果一个页面没有外部链接,它会导致分配给它的PageRank值在下一轮迭代时“泄漏”,无法传递给其他页面
- 排名沉默: 如果有一组页面只有内部链接互相指向,没有外部页面指向它们,这些页面会累积越来越多的PageRank值,造成其他部分网络的PageRank值“沉没”。
- 真实世界中,浏览者不仅仅通过点击链接来访问页面,还可能直接输入网址或通过书签访问。
改进
因此,PageRank算法引入了阻尼因子
d
d
d(通常设为0.8 或者是 0.9),表示页面被直接访问的概率。这样,某个页面的PageRank值就变成了:
P
R
(
p
i
)
=
1
−
d
N
⋅
1
+
d
∑
p
j
∈
M
(
p
i
)
P
R
(
p
j
)
L
(
p
j
)
,
\begin{aligned}PR(p_i)&=\frac{1-d}N\cdot 1+d\sum_{p_j\in M(p_i)}\frac{PR(p_j)}{L(p_j)}\end{aligned},
PR(pi)=N1−d⋅1+dpj∈M(pi)∑L(pj)PR(pj),
其中,
N
N
N是总结点数量(总网页数)
计算
实际情况下,要计算图中所有的PageRank值,可以把结点的PageRank值转换成向量,迭代公式转换成矩阵,这样每一次迭代就是一个矩阵和向量的乘法,这种转换利于计算机进行处理
构造转换矩阵
构造一个
N
×
N
N×N
N×N的矩阵
T
\mathbf{T}
T,其中
N
N
N是页面的总数。如果页面j有一个链接指向页面
i
i
i,则将
T
T
T的第
j
j
j列和第i行的元素
T
T
T设为
T
\mathbf{T}
T;如果页面j没有链接到页面i,则
T
j
=
0
T_j=0
Tj=0。
也就是说,
T
i
j
T_{ij}
Tij表示页面
j
j
j到页面
i
i
i的转移概率。
构造PageRank向量
构造一个PageRank向量 P R ⃗ \vec {PR} PR,它是一个 N × 1 N×1 N×1 的列向量,初始时每个元素都是 1 N \frac{1}{N} N1,表示初始时每个页面的PageRank值都是相等的
迭代公式
考虑未加入阻尼因子
d
d
d的情况下,每次迭代相当于是把PageRank向量
P
R
⃗
\vec {PR}
PR乘一个转换矩阵
T
\mathbf{T}
T,因此迭代公式就变成了
P
R
⃗
=
T
⋅
P
R
⃗
,
\vec {PR}=\mathbf{T}\cdot \vec {PR},
PR=T⋅PR,
其中的
=
=
=表示赋值,这里右乘是因为
P
R
⃗
\vec{PR}
PR表示每个结点的PageRank值,矩阵
T
\mathbf{T}
T的每个元素表示的是从表示页面
j
j
j到页面
i
i
i的转移概率,则\mathbf{T}的第
i
i
i行就表示所有结点转移到结点
i
i
i的概率(初始化是
1
N
\frac{1}{N}
N1),因此\mathbf{T}的第
i
i
i行与
P
R
⃗
\vec {PR}
PR相乘求和的结果就是所有结点的PageRank值除以出度的值再进行求和。
当考虑到阻尼系数
d
d
d后,迭代计算公式就变成了
P
R
⃗
=
d
⋅
T
⋅
P
R
⃗
+
1
−
d
N
⋅
1
,
\vec {PR}=d\cdot \mathbf{T}\cdot\vec {PR}+\frac{1-d}N\cdot \mathbf{1} ,
PR=d⋅T⋅PR+N1−d⋅1,其中
1
\mathbf{1}
1表示
N
×
1
N×1
N×1的向量
PageRank算法缺陷
PageRank算法也存在很多固有的缺陷
- 忽略内容质量:PageRank只考虑页面间的链接结构,而没有考虑页面内容的质量和相关性。这意味着高PageRank的页面不一定提供用户真正需要的信息。
- 操纵易性:由于PageRank主要基于链接,这使得它容易受到链接农场(link farms)或黑帽SEO的操纵。有些网站可能通过不正当手段增加指向它们的链接,从而提高其PageRank。
- 新页面劣势:新页面或较少被链接的页面可能会有不公平的劣势,因为它们需要时间来积累外部链接。这被称为“富者愈富”效应,即已经流行或排名靠前的页面更容易获得新的链接。
- 用户意图忽视:PageRank算法没有考虑用户的搜索意图。用户对于不同的搜索查询有不同的需求,而单纯基于PageRank的结果可能并不总是满足用户的具体需求。