要说到 PageRank 算法的来源,这个要从搜索引擎的发展讲起。最早的搜索引擎采用的是分类目录的方法,即通过人工进行网页分类并整理出高质量的网站。那时 Yahoo 和国内的 hao123 就是使用这种方法。
后来网页越来越多,人工分类已经不现实了。搜索引擎进入了文本检索的时代,即计算用户查询关键词与网页内容的相关程度来返回搜索结果。这种方法突破了数量的限制,但是搜索结果不是很好。因为总有某些网页来回地倒腾某些关键词使自己的搜索排名靠前。
于是我们的主角登场了。谷歌的两位创始人,当时还是美国斯坦福大学研究生的佩奇和布林开始了对网页排序问题的研究。他们借鉴了学术界评判学术论文重要性的通用方法,那就是看论文的引用次数。由此想到网页的重要性也可以根据这种方法来评价。于是 PageRank 的核心思想就诞生了。
PageRank 算法计算每一个网页的 PageRank 值,然后根据这个值的大小对网页的重要性进行排序。它的思想是模拟一个悠闲的上网者,上网者首先随机选择一个网页打开,然后在这个网页上呆了几分钟,跳转到该网页所指向的链接,这样无所事事、漫无目的地在网页上跳来跳去,PageRank 就是估计这个悠闲的上网者分布在各个网页上的概率。
PageRank 背后的两个基本假设:
我们可以将 Web 作如下抽象:
因此,整个 Web 被抽象为一张有向图。
此时,我们需要用一种合适的数据结构来表示页面以及页面间的连接关系。假设当一个用户停留在某页面时,跳转到它所链接的所有页面的概率是相同的。例如,上图中 A 页面链向 B、C、D,所以用户从 A 页面跳转到 B、C、D 的概率各为 1/3。设一共有 N 个网页,则可以组织这样一个 N 维矩阵:其中 i 行 j 列的值表示用户从页面 j 跳转到页面 i 的概率。这样的一个矩阵叫做转移矩阵(Transition Matrix)。
M = [ A → A B → A C → A D → A A → B B → B C → B D → B A → C B → C C → C D → C A → D B → D C → D D → D ] M = [ 0 1 2 0 1 2 1 3 0 0 1 2 1 3 1 2 0 0 1 3 0 1 0 ] M = \begin{bmatrix} A \rightarrow A && B \rightarrow A && C \rightarrow A && D \rightarrow A \\ A \rightarrow B && B \rightarrow B && C \rightarrow B && D \rightarrow B \\ A \rightarrow C && B \rightarrow C && C \rightarrow C && D \rightarrow C \\ A \rightarrow D && B \rightarrow D && C \rightarrow D && D \rightarrow D \\ \end{bmatrix} \quad M = \begin{bmatrix} 0 && \frac{1}{2} && 0 && \frac{1}{2} \\ \frac{1}{3} && 0 && 0 && \frac{1}{2} \\ \frac{1}{3} && \frac{1}{2} && 0 && 0 \\ \frac{1}{3} && 0 && 1 && 0 \\ \end{bmatrix} M=⎣⎢⎢⎡A→AA→BA→CA→DB→AB→BB→CB→DC→AC→BC→CC→DD→AD→BD→CD→D⎦⎥⎥⎤M=⎣⎢⎢⎡03131312102100001212100⎦⎥⎥⎤
观察转移矩阵可以发现:
PageRank 值的物理意义是一个网页被访问的概率,初始时用户访问每个页面的概率均等,假设一共有 N 个网页,每个网页的初始 PR 值 = 1 / N。我们可以将这些网页的初始 PR 值保存到一个向量中。
继续沿用先前的图,初始 PR 值向量 P 0 = ( P R A , P R B , P R C , P R D ) T = ( 1 4 , 1 4 , 1 4 , 1 4 ) T P_0 = (PR_A, PR_B, PR_C, PR_D)^T = (\frac{1}{4}, \frac{1}{4}, \frac{1}{4}, \frac{1}{4})^T P0=(PRA,PRB,PRC,PRD)T=(41,41,41,41)T
继续使用先前的例子,由 A、B、C、D 四个页面组成的 Web。
对于页面 A 来说,有 B、D 页面链向它,那么 A 的 PR 值(PageRank 值)将是 B、D 页面 PR 值之和。
P R ( A ) = P R ( B ) + P R ( D ) PR(A) = PR(B) + PR(D) PR(A)=PR(B)+PR(D)
由于页面 B 也有链接到页面 C,一个页面不能投票 2 次,所以 B 给每个页面半票。同样的,D 投出的票也只有 1/2 算到了 A 的 PageRank 上。
P R ( A ) = P R ( B ) 2 + P R ( D ) 2 PR(A) = \frac{PR(B)}{2} + \frac{PR(D)}{2} PR(A)=2PR(B)+2PR(D)
换句话说,根据链出总数平分一个页面的 PR 值,令 L(X) 表示 X 页面的链出总数,那么 A 的 PageRank 值计算公式可写成如下统一形式。
P R ( A ) = P R ( B ) L ( B ) + P R ( D ) L ( D ) PR(A) = \frac{PR(B)}{L(B)} + \frac{PR(D)}{L(D)} PR(A)=L(B)PR(B)+L(D)PR(D)
我们再把上面的公式简化一下,将其推广到更大的范围。
P R i = ∑ j ∈ B i P R j L j PR_i = \sum_{j \in B_i}\frac{PR_j}{L_j} PRi=j∈Bi∑LjPRj
其中 P R i PR_i PRi 表示网页 i 的 pagerank 值, P R j PR_j PRj 表示网页 j 的 pagerank 值, L j L_j Lj 表示网页 j 链出的链接数, B i B_i Bi 表示链接到网页 i 的网页集合。
这样,我们就可以计算任意一个网页的 pagerank 值。那么要怎么计算呢?观察 PR(A) 的计算公式我们可以发现,PR(A) 实际上等于转移矩阵 M 的第一行乘上初始 PR 值。我们回想一下转移矩阵的性质,每一行表示其他网页链接到当前网页的概率,这一行的概率指相加实际上就是我们上述推导的公式。所以,如果要同时计算 Web 上的所有页面,我们可以直接计算转移矩阵 M 每一行的概率值累加和。
[ 1 5 6 5 6 4 3 ] \begin{bmatrix} 1 && \frac{5}{6} && \frac{5}{6} && \frac{4}{3} \end{bmatrix} [1656534]
由于我们计算的是概率值,且初始每个页面的概率都相等,因此我们可求出在经过上述出链和入链后,各个页面的停留概率。
P 1 = M ⋅ P 0 = [ 0 1 2 0 1 2 1 3 0 0 1 2 1 3 1 2 0 0 1 3 0 1 0 ] ⋅ [ 1 4 1 4 1 4 1 4 ] = [ 1 4 5 24 5 24 1 3 ] P_1 = M \cdot P_0 = \begin{bmatrix} 0 && \frac{1}{2} && 0 && \frac{1}{2} \\ \frac{1}{3} && 0 && 0 && \frac{1}{2} \\ \frac{1}{3} && \frac{1}{2} && 0 && 0 \\ \frac{1}{3} && 0 && 1 && 0 \\ \end{bmatrix} \cdot \begin{bmatrix} \frac{1}{4} \\ \frac{1}{4} \\ \frac{1}{4} \\ \frac{1}{4} \\ \end{bmatrix} = \begin{bmatrix} \frac{1}{4} \\ \frac{5}{24} \\ \frac{5}{24} \\ \frac{1}{3} \\ \end{bmatrix} P1=M⋅P0=⎣⎢⎢⎡03131312102100001212100⎦⎥⎥⎤⋅⎣⎢⎢⎡41414141⎦⎥⎥⎤=⎣⎢⎢⎡4124524531⎦⎥⎥⎤
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cKD0rPuB-1584525452315)(https://s2.ax1x.com/2019/04/28/EQ86Qx.jpg)]
先前所举的例子是一个理想状态:假设所有网页组成的有向图是强连通的,即从一个网页可以到达任意网页。但实际的网络链接环境没有这么理想,有一些网页不指向任何网页,或不存在指向自己的链接。
【终止点】:一个没有任何出链的网页,例如上图的 C 点。上网者浏览到 C 网页将终止于该网页,而无法继续浏览其他网页。
根据上图我们可以写出转移矩阵 M:
M = [ 0 1 2 0 0 1 3 0 0 1 2 1 3 0 0 1 2 1 3 1 2 0 0 ] M = \begin{bmatrix} 0 & \frac{1}{2} & 0 & 0 \\ \frac{1}{3} & 0 & 0 & \frac{1}{2} \\ \frac{1}{3} & 0 & 0 & \frac{1}{2} \\ \frac{1}{3} & \frac{1}{2} & 0 & 0 \\ \end{bmatrix} M=⎣⎢⎢⎡03131312100210000021210⎦⎥⎥⎤
然后根据公式 P n = M ⋅ P n − 1 = M n ⋅ P 0 P_n = M \cdot P_{n-1} = M^n \cdot P_0 Pn=M⋅Pn−1=Mn⋅P0 迭代计算出 PR 值向量。
P 0 = [ 1 / 4 1 / 4 1 / 4 1 / 4 ] P 1 = M ⋅ P 0 = [ 3 / 24 5 / 24 5 / 24 5 / 24 ] P 2 = M ⋅ P 1 = [ 5 / 48 7 / 48 7 / 48 7 / 48 ] ⋯ P n = M ⋅ P n − 1 = [ 0 0 0 0 ] P_0 = \begin{bmatrix} 1/4 \\ 1/4 \\ 1/4 \\ 1/4 \\ \end{bmatrix} \quad P_1 = M \cdot P_0 = \begin{bmatrix} 3/24 \\ 5/24 \\ 5/24 \\ 5/24 \\ \end{bmatrix} P_2 = M \cdot P_1 = \begin{bmatrix} 5/48 \\ 7/48 \\ 7/48 \\ 7/48 \\ \end{bmatrix} \quad \cdots \quad P_n = M \cdot P_{n-1} = \begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \\ \end{bmatrix} P0=⎣⎢⎢⎡1/41/41/41/4⎦⎥⎥⎤P1=M⋅P0=⎣⎢⎢⎡3/245/245/245/24⎦⎥⎥⎤P2=M⋅P1=⎣⎢⎢⎡5/487/487/487/48⎦⎥⎥⎤⋯Pn=M⋅Pn−1=⎣⎢⎢⎡0000⎦⎥⎥⎤
可以看到,经过多次跳转之后,所有网页的 PR 值都是 0,这样的计算结果是无意义的。为什么会这样?因为转移矩阵 M 的第 3 列全为 0,这是导致迭代结果最终归零的“罪魁祸首”。
【解决方案】:当访问到终止点 C 而“走投无路”时,以等概率随机跳转到下一个网页,从而开启一次新的访问。
陷阱指的是只有指向自身链接的网页,见下图 C。
上网者浏览到 C 网页将陷入无休止的循环之中,根据上图我们可以写出转移矩阵 M:
M = [ 0 1 2 0 0 1 3 0 0 1 2 1 3 0 1 1 2 1 3 1 2 0 0 ] M = \begin{bmatrix} 0 & \frac{1}{2} & 0 & 0 \\ \frac{1}{3} & 0 & 0 & \frac{1}{2} \\ \frac{1}{3} & 0 & 1 & \frac{1}{2} \\ \frac{1}{3} & \frac{1}{2} & 0 & 0 \\ \end{bmatrix} M=⎣⎢⎢⎡03131312100210010021210⎦⎥⎥⎤
根据公式 P n = M ⋅ P n − 1 = M n ⋅ P 0 P_n = M \cdot P_{n-1} = M^n \cdot P_0 Pn=M⋅Pn−1=Mn⋅P0,迭代计算出 PR 值向量。
[ 1 / 4 1 / 4 1 / 4 1 / 4 ] [ 3 / 24 5 / 24 11 / 24 5 / 24 ] [ 5 / 48 7 / 48 29 / 48 7 / 48 ] ⋯ [ 0 0 1 0 ] \begin{bmatrix} 1/4 \\ 1/4 \\ 1/4 \\ 1/4 \\ \end{bmatrix} \quad \begin{bmatrix} 3/24 \\ 5/24 \\ 11/24 \\ 5/24 \\ \end{bmatrix} \quad \begin{bmatrix} 5/48 \\ 7/48 \\ 29/48 \\ 7/48 \\ \end{bmatrix} \quad \cdots \begin{bmatrix} 0 \\ 0 \\ 1 \\ 0 \\ \end{bmatrix} ⎣⎢⎢⎡1/41/41/41/4⎦⎥⎥⎤⎣⎢⎢⎡3/245/2411/245/24⎦⎥⎥⎤⎣⎢⎢⎡5/487/4829/487/48⎦⎥⎥⎤⋯⎣⎢⎢⎡0010⎦⎥⎥⎤
可以看到经过多次跳转,跳转到陷阱页面的概率值为 1,而跳转到其他正常网页的概率值为 0,这样的计算结果也是无意义的。
除了自己只链接自己这一种形式的陷阱,还存在一种多个页面相互链接的陷阱。
上图中 5、6、7 三个页面构成一个闭环,它们紧密链接成环而没有外出的链接,最终也会导致上网者“深陷于此”。同样的,经过多次跳转,陷阱网页的概率值之和为 1,而其他正常网页的概率值为 0。
当用户遇到终止点或者陷阱的话,他不会不知所措,也不会无休止地自己打转,他会通过浏览器的地址栏输入新的地址,以逃离这个网页。也就是说,用户以一个网页跳转至另一个网页的过程中,会以一定概率不点击当前网页的链接,而是在地址栏中输入一个新的地址。
【解决方案】:随机浏览模型。
假定一个上网者从一个随机的网页开始浏览,此时有两种选择:
其中,上网者通过点击链接开启新页面的概率为 d(d 也称阻尼系数,通常取 0.85)。此时,我们的 PageRank 模型变为:在每一个页面,用户都有 d 的概率通过点击链接进入下一个页面;此外,还有 1 - d 的概率随机跳转,此时跳转到其他页面的概率为 1 / N(当前页面的其他链接数)。
【随机浏览模型公式】:
P R i = d ∑ j ∈ B i P R j L j + 1 − d N PR_i = d\sum_{j\in B_i}\frac{PR_j}{L_j} + \frac{1 - d}{N} PRi=dj∈Bi∑LjPRj+N1−d
【概率转移公式】:
P n = d M ⋅ P n − 1 + ( 1 − d ) P 0 P n = A P n − 1 A = d M + ( 1 − d ) e e T / N P_n = dM \cdot P_{n-1} + (1-d)P_0 \\ P_n = AP_{n-1} \quad A = dM + (1-d)ee^T/N Pn=dM⋅Pn−1+(1−d)P0Pn=APn−1A=dM+(1−d)eeT/N
如何通过随机浏览模型解决陷阱问题呢?仍然以先前的实例为例。
先使用概率转移公式计算跳转到每个页面的概率值。
P 0 = [ 1 / 4 1 / 4 1 / 4 1 / 4 ] P 1 = 0.85 ∗ [ 0 1 / 2 0 0 1 / 3 0 0 1 / 2 1 / 3 0 1 1 / 2 1 / 3 1 / 2 0 0 ] [ 1 / 4 1 / 4 1 / 4 1 / 4 ] + 0.15 ∗ [ 1 / 4 1 / 4 1 / 4 1 / 4 ] P_0 = \begin{bmatrix} 1/4 \\ 1/4 \\ 1/4 \\ 1/4 \\ \end{bmatrix} \quad P_1 = 0.85 * \begin{bmatrix} 0 & 1/2 & 0 & 0 \\ 1/3 & 0 & 0 & 1/2 \\ 1/3 & 0 & 1 & 1/2 \\ 1/3 & 1/2 & 0 & 0 \\ \end{bmatrix} \qquad \begin{bmatrix} 1/4 \\ 1/4 \\ 1/4 \\ 1/4 \\ \end{bmatrix} + 0.15 * \begin{bmatrix} 1/4 \\ 1/4 \\ 1/4 \\ 1/4 \\ \end{bmatrix} P0=⎣⎢⎢⎡1/41/41/41/4⎦⎥⎥⎤P1=0.85∗⎣⎢⎢⎡01/31/31/31/2001/2001001/21/20⎦⎥⎥⎤⎣⎢⎢⎡1/41/41/41/4⎦⎥⎥⎤+0.15∗⎣⎢⎢⎡1/41/41/41/4⎦⎥⎥⎤
由于存在一定的概率跳出循环,因此可以避免陷阱问题。
PageRank 模型的前提:假设用户选择浏览的下一个网页与过去浏览过哪些网页无关,而仅依赖于当前所在的页面,则该过程可以认为是一个有限状态、离散时间的随机过程。
这种“将来”的情况与“过去”无关,而只与“当前”状态有关的性质称为马尔可夫性。具有马尔可夫性的随机过程称为马尔可夫过程。时间和状态都是离散的马尔可夫过程称为马尔可夫链—— P 0 , P 1 , P 2 , ⋯ , P n P_0, P_1, P_2, \cdots, P_n P0,P1,P2,⋯,Pn 是一个马尔可夫链。
对于马尔可夫链 P n = A P n − 1 P_n = AP_{n-1} Pn=APn−1,当概率转移矩阵 A 满足以下 3 个条件时, P n P_n Pn 最终收敛,保持在一个稳定值附近。
首先介绍两个新的概念——链接农场和黄金链。
链接作弊者眼中的 Web 组成结构:
假设目标网页 T 的总 PageRank 值为 y,则 y 由三部分组成:
综上所述
y = x + β m ( β y m + ( 1 − β ) n ) = x + β 2 y + β ( 1 − β ) m n y = x + \beta m(\frac{\beta y}{m} + \frac{(1-\beta)}{n}) = x + \beta^2 y + \frac{\beta(1-\beta)m}{n} y=x+βm(mβy+n(1−β))=x+β2y+nβ(1−β)m
解得
y = x 1 − β 2 + β m ( 1 + β ) n y = \frac{x}{1-\beta^2} + \frac{\beta m}{(1+\beta)n} y=1−β2x+(1+β)nβm
(注:之前上述公式的后一项分母写成了 ( 1 − β ) n (1-\beta)n (1−β)n,经 ershitianxia 同学的指正,已修改为 ( 1 + β ) n (1+\beta)n (1+β)n,对先前阅读过该篇文章而造成误解的读者表示歉意,也很感谢 ershitianxia 同学的评论,说明我写的文章还是能够让读者读下去的。)
如果选择 β = 0.85,那么 1 / ( 1 − β 2 ) = 3.6 , β / ( 1 + β ) = 0.46 1 / (1-β^2) = 3.6, \beta/(1+\beta) = 0.46 1/(1−β2)=3.6,β/(1+β)=0.46。也就是说,上述结构能够把可达网页的 PageRank 贡献放大到 3.6 倍,并且还可以获得自有网页数目和总网页数目比值(m/n)的 46%。
那么要如何针对这一种作弊行为呢?搜索引擎可以修改 PageRank 算法的定义来自动降低链接作弊网页的重要度。
【TrustRank】:如果一个网页的 PageRank 值远高于可信网页的值,则很可能这个网页被 Spam 了。
随着Facebook的流行,社交网络平台和应用占据了互联网的主流,社交网络平台强调用户之间的联系和交互,这对传统的搜索技术提出了新的挑战。
传统搜索技术强调搜索结果和用户需求的相关性,社会化搜索除了相关性外,还额外增加了一个维社交网络内其他用户发布的信息、点评或验证过的信息则更容易信赖,这是与用户度,即搜索结果的可信赖性。对某个搜索结果,传统的结果可能成千上万,但如果处于用户的心里密切相关的。社会化搜索为用户提供更准确、更值得信任的搜索结果。
随着微博的个人媒体平台兴起,对搜索引擎的实时性要求日益增高,我想这也是搜索时引擎未来的一个发展方向。
实时搜索最突出的特点是时效性强,越来越多的突发事件首次发布在微博上,实时搜索核心强调的就是“快”,用户发布的信息第一时间能被搜索引擎搜索到。
不过在国内,实时搜索由于各方面的原因无法普及使用,比如 Google 的实时搜索是被重置的,百度也没有明显的实时搜索入口。
目前搜索引擎的查询还是基于文字的,即使是图片和视频搜索也是基于文本方式。那么未来的多媒体搜索技术则会弥补查询这一缺失。多媒体形式除了文字,主要包括图片、音频、视频。
多媒体搜索比纯文本搜索要复杂许多,一般多媒体搜索包含 4 个主要步骤:多媒体特征提取、多媒体数据流分割、多媒体数据分类和多媒体数据搜索引擎。