PageRank

PageRank算法是谷歌两位创始人发明的网页排序算法,根据网页重要性排名,对网页进行推荐的算法。

互联网可以看作是一个巨大的网络,网络中的节点就是网站,节点之间的边是网站之间的链接。如何评价图中节点的重要性呢?PageRank算法用一个pagerank值来衡量网页的重要性,那这个值怎么计算呢?

PageRank算法有两个核心思想

  1. 如果一个网页被很多其他网页链接到的话,说明这个网页比较重要,也就是 PageRank 值会相对较高
  2. 如果一个 PageRank 值很高的网页链接到一个其他的网页,那么链接到的网页的 PageRank 值也会相应地提高。

在这里插入图片描述

我们假设用户停留在一个页面时,这时他跳到页面链接的所有页面的概率是相同的。如上图从 A 页面跳到 B、C、D 的概率都是 1/3 。 一共有 N 个网页的话,就可以组成 N 维的矩阵,即转移矩阵
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 = \left[ \begin{matrix} 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\end{matrix} \right] M = \left[ \begin{matrix} 0 & 1/2 & 0 & 1/2 \\ 1/3 & 0 & 0 & 1/2 \\ 1/3 & 1/2 & 0 & 0 \\ 1/3 & 0 & 1 & 0\end{matrix} \right] M=A>AA>BA>CA>DB>AB>BB>CB>DC>AC>BC>CC>DD>AD>BD>CD>DM=01/31/31/31/201/2000011/21/200
观察转移矩阵可以发现:

  • 矩阵的每一列行代表一个具体网页的出链,简单地说就是当前网页向其他网页的链接;
  • 矩阵的每一行代表一个具体网页的入链,简单地说就是其他网页向当前网页的链接。

PR值的计算公式是:

P R i = Σ j ∈ B i P R j L j PR_i=\underset {j \in B_i}\Sigma \frac{PR_j}{L_j} PRi=jBiΣLjPRj

其中 P R i PR_i PRi表示网页 i 的pagerank值, L j L_j Lj 表示网页 j 链出的链接数, B i B_i Bi 表示链接到网页 i 的网页集合。

观察 PR(A) 的计算公式我们可以发现,PR(A) 实际上等于转移矩阵 M 的第一行乘上初始 PR 值。我们回想一下转移矩阵的性质,每一行表示其他网页链接到当前网页的概率,这一行的概率指相加实际上就是我们上述推导的公式。所以,如果要同时计算 Web 上的所有页面,我们可以直接计算转移矩阵 M 每一行的概率值累加和。

PR算法

上图中我们假设4个点的初始PR值都是 1/4,即

P 0 = [ 1 / 4 1 / 4 1 / 4 1 / 4 ] P_0=\left[ \begin{matrix} 1/4 & 1/4 & 1/4 & 1/4\end{matrix} \right] P0=[1/41/41/41/4]

经过一次计算得到新的PR值

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 4 / 25 4 / 25 1 / 3 ] P_1 = M.P_0=\left[ \begin{matrix} 0 & 1/2 & 0 & 1/2 \\ 1/3 & 0 & 0 & 1/2 \\ 1/3 & 1/2 & 0 & 0 \\ 1/3 & 0 & 1 & 0\end{matrix} \right] . \left[ \begin{matrix} 1/4 \\ 1/4 \\ 1/4 \\ 1/4\end{matrix} \right] = \left[ \begin{matrix} 1/4 \\ 4/25 \\ 4/25 \\ 1/3\end{matrix} \right] P1=M.P0=01/31/31/31/201/2000011/21/200.1/41/41/41/4=1/44/254/251/3

然后经过 n 次迭代后,PR值不再变化,就得到了各个节点的PR值。

终结点问题

先前所举的例子是一个理想状态:假设所有网页组成的有向图是强连通的,即从一个网页可以到达任意网页。但实际的网络链接环境没有这么理想,有一些网页不指向任何网页,或不存在指向自己的链接。

在这里插入图片描述

【终止点】:一个没有任何出链的网页,例如上图的 C 点。上网者浏览到 C 网页将终止于该网页,而无法继续浏览其他网页。

按照上面的计算步骤,该种情况经过几次迭代,所有节点的PR值最终等于0,因此当访问到终止点 C 而“走投无路”时,以等概率随机跳转到下一个网页,从而开启一次新的访问

  • 改造终止点 C,使它能够等概率地游走到网络中的所有页面,即添加从 C 到包括它本身的所有页面的链接。
  • 在上例中就是将转移矩阵 M 的第三列的每一项改为 1/4。这样改造后,每一个节点都有出链,相应的 M 的每一列的列累加和都为 1。

陷阱问题

陷阱指的是只有指向自身链接的网页,见下图

在这里插入图片描述

上网者浏览到 C 网页将陷入无休止的循环之中,经过多次迭代计算后,跳转到C的概率为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 \underset {j \in B_i}\Sigma \frac{PR_j}{L_j} + \frac{1-d}{N} PRi=djBiΣLjPRj+N1d

概率转移公式

P n = d M . P n − 1 + ( 1 − d ) P 0 P_n = d M.P_{n-1} + (1-d)P_0 Pn=dM.Pn1+(1d)P0

PageRank算法缺点

  1. 主题漂移问题:PageRank 算法仅利用网络的链接结构,无法判断网页内容上的相似性;且算法根据向外链接平均分配权值使得主题不相关的网页获得与主题相关的网页同样的重视度,出现主题漂移。
  2. 没有过滤广告链接和功能链接:例如常见的“分享到微博”,这些链接通常没有什么实际价值,前者链接到广告页面,后者常常链接到某个社交网站首页。
  3. 对新网页不友好:一个新网页的入链相对较少,即便它的内容质量很高,但要成为一个高 PR 值的页面仍需要很长时间的推广。

代码

来自网络

"""
PageRank algoritm

@sort: pagerank
"""

def pagerank(graph, damping_factor=0.85, max_iterations=100, min_delta=0.00001):
    """
    Compute and return the PageRank in an directed graph.    
    
    @type  graph: digraph
    @param graph: Digraph.
    
    @type  damping_factor: number
    @param damping_factor: PageRank dumping factor.
    
    @type  max_iterations: number 
    @param max_iterations: Maximum number of iterations.
    
    @type  min_delta: number
    @param min_delta: Smallest variation required to have a new iteration.
    
    @rtype:  Dict
    @return: Dict containing all the nodes PageRank.
    """
    
    nodes = graph.nodes()
    graph_size = len(nodes)
    if graph_size == 0:
        return {}
    min_value = (1.0-damping_factor)/graph_size #value for nodes without inbound links
    
    # itialize the page rank dict with 1/N for all nodes
    pagerank = dict.fromkeys(nodes, 1.0/graph_size)
        
    for i in range(max_iterations):
        diff = 0 #total difference compared to last iteraction
        # computes each node PageRank based on inbound links
        for node in nodes:
            rank = min_value
            for referring_page in graph.incidents(node):
                rank += damping_factor * pagerank[referring_page] / len(graph.neighbors(referring_page))
                
            diff += abs(pagerank[node] - rank)
            pagerank[node] = rank
        
        #stop if PageRank has converged
        if diff < min_delta:
            break
    
    return pagerank

参考

https://blog.csdn.net/weixin_43378396/article/details/90322422

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值