zoukankan      html  css  js  c++  java
  • PageRank简单实现中的一个错误

    在我的一篇博客PageRank中,在5.1 算法实现中简单实现部分原本是有一个错误的。这个错误也体现出我当时对PageRank算法有理解上的偏差。


    这是个什么样的错误呢?是这样的:

    简单实现中计算每个网页的PR值时使用的是最原始的方法,即下面的这个公式:

    [PR(p_{i}) = alpha sum_{p_{j} in M_{p_{i}}} frac{PR(p_{j})}{L(p_{j})} + frac{(1 - alpha)}{N} ]

    这个公式要求所有网页的PR值之和为1。而我原本的代码中给每个网页赋予的初始PR值的代码为:

    page_rank = dict.fromkeys(nodes, 1.0)  # 给每个节点赋予初始的PR值
    

    也就是说,我给出的初始PR值之和为5(例子中共有5个网页)。

    犯这个错误的原因是我理解错了“(P_0)的选取无关”这句话。正确的理解应该是:“(P_0)的初始概率分布无关”。


    然而,我理解错了也还有另一个原因,那就是我原来的程序中不管给出的初始PR值是多少,最终的PR值都是一样的。现分析如下:

    按照我原本的程序逻辑,我使用的公式应该是这样的,其中(G)为所有网页:

    [PR(p_{i}) = alpha sum_{p_{j} in M_{p_{i}}} frac{PR(p_{j})}{L(p_{j})} + frac{(1 - alpha)}{N} sum_{p_k in G} PR(p_k) ]

    而我却使用了最原始的公式,造成了:

    [每轮迭代,每个页面的PR值都减少了 frac{(1 - alpha)}{N} * (上轮PR值总和 - 1) \ Rightarrow 每轮迭代,PR值总和都减少了 (1 - alpha) * (上轮PR值总和 - 1) ]

    现假设初始PR值总和为 (A_0),则有:

    [最开始,PR值总和为:A_0 \ 第一轮迭代之后,PR值总和为:A_1 = A_0 - (1 - alpha) (A_0 - 1) = alpha A_0 + 1 - alpha \ 以此类推,则有 \ A_{n} = alpha A_{n-1} + 1 - alpha \ Rightarrow A_{n} - 1 = alpha (A_{n-1} - 1) \ Rightarrow A_{n} - 1 = alpha^{n} (A_{0} - 1) \ Rightarrow A_{n} = alpha^{n} (A_{0} - 1) + 1\ ecause alpha < 1 \ herefore lim_{n ightarrow infty} A_n = 1 ]

    即不管初始PR值为多少,最终其和都将趋于1(若初始值之和小于1,用相似的方法可以证明)。也就是说,最终结果是一样的(因为最终趋于1之后就相当于以“PR值总和为1”的情况又开始了计算)。这一点在代码中也有体现:当PR值设置得很大的时候,需要迭代的次数也相应增大。


    总结:应该使用最上面的公式,同时初始PR值总和应该设置为1。

  • 相关阅读:
    数据清洗
    JAVA多线程三种实现方式
    QT-4.8.6 编译配置过程
    qt 编译问题总结
    [转载]tslib1.4与Qt4.8.6的交叉编译与移植
    STC12C5A60S2 @ 22.0184Mhz 精确延时
    STC12C5A60S2 双串口通信
    C# Bitmap 复制
    TextMate2 最新版下载及源码编译过程
    mac系统 PHP Nginx环境变量修改
  • 原文地址:https://www.cnblogs.com/rubinorth/p/5799958.html
Copyright © 2011-2022 走看看