networkxページランク

インターネット上にはページランクに関する紹介がたくさんあり、ページランクを始めるのは難しくないので、当初はこのブログを書きたくないと思っていました。ただし、networkxに実装されているページランクは、ほとんどのオンライン資料で紹介されているページランクとは異なります。インターネット上での指示は比較的少ないので、このブログはこれに焦点を当てています。

1.pagerankの紹介

まず、pagerankへのリンクをいくつか示します。

  1. ページランクの簡単な紹介と実装。このリンクは、ページランクの最も原始的なアイデアを紹介しています。また、明確に書かれています。その後、実装コードが提供されます。コードも非常に明確で理解しやすいですが、実装されたページランクは最も原始的です。ページランク、さらに問題が発生します。その反復式は次のとおりです。
    ここに写真の説明を挿入
  2. Pagerankには、より詳細な紹介があります。このリンクの紹介は、比較的詳細です。与えられた反復式も改善されています。これは、ほとんどのオンライン資料で言及されているページランクでもあります。
    ここに写真の説明を挿入
  3. Networkxは、ページランクのソースコード解析を実装公式文書上記のソースコード解析と公式文書である。networkxでページランクと1,2-リンクでページランクが異なる反復式を有する。ソースコード解析での説明も正しいですが、私は思いますまだまだわかりにくいので、さらに説明したいと思います。それがこのブログを書いた理由です。また、2つの例で、2番目の2つのリンクの反復式がソースコード分析の式と異なることを確認しましたが、興味深いのは、結果が同じように見えることですが、理論的には主に理由がわかりません。あなたがメッセージを残すことができると知っているなら、数学は十分ではありません。

2.networkxによって実装されたページランクの説明

まず、各入力パラメータの説明をソースコードに投稿する必要があります。これを見れば、各パラメータの意味がわかりやすいです。基本的に、パラメータは簡単に理解できます。前述のリンクのブログで説明されています。少し紛らわしいのは、パラメータのぶら下がりです。このパラメータは、ぶら下がりノード用に用意されています。ぶら下がりノードとは、つまり、アウトディグリーです。上記のブログ投稿では、0のノードを終端点と呼びます。ぶら下がりノードは、繰り返し処理中にぶら下がりノードのpr値をどんどん大きくするため、繰り返し式を改善する必要があります。ここに辞書を入力できます。ぶら下がりノードの重みを指定します。指定しない場合、デフォルトのぶら下がりノードと他のノードの重みは同じです。つまり、重みはすべて平均です。他の人は大丈夫なはずです。

def pagerank(G, alpha=0.85, personalization=None,
             max_iter=100, tol=1.0e-6, nstart=None, weight='weight',
             dangling=None):
    """Return the PageRank of the nodes in the graph.

    PageRank computes a ranking of the nodes in the graph G based on
    the structure of the incoming links. It was originally designed as
    an algorithm to rank web pages.

    Parameters
    ----------
    G : graph
      A NetworkX graph.  Undirected graphs will be converted to a directed
      graph with two directed edges for each undirected edge.

    alpha : float, optional
      Damping parameter for PageRank, default=0.85.

    personalization: dict, optional
      The "personalization vector" consisting of a dictionary with a
      key for every graph node and nonzero personalization value for each node.
      By default, a uniform distribution is used.

    max_iter : integer, optional
      Maximum number of iterations in power method eigenvalue solver.

    tol : float, optional
      Error tolerance used to check convergence in power method solver.

    nstart : dictionary, optional
      Starting value of PageRank iteration for each node.

    weight : key, optional
      Edge data key to use as weight.  If None weights are set to 1.

    dangling: dict, optional
      The outedges to be assigned to any "dangling" nodes, i.e., nodes without
      any outedges. The dict key is the node the outedge points to and the dict
      value is the weight of that outedge. By default, dangling nodes are given
      outedges according to the personalization vector (uniform if not
      specified). This must be selected to result in an irreducible transition
      matrix (see notes under google_matrix). It may be common to have the
      dangling dict to be the same as the personalization dict.

    Returns
    -------
    pagerank : dictionary
       Dictionary of nodes with PageRank as value

    Examples
    --------
    >>> G = nx.DiGraph(nx.path_graph(4))
    >>> pr = nx.pagerank(G, alpha=0.9)

    Notes
    -----
    The eigenvector calculation is done by the power iteration method
    and has no guarantee of convergence.  The iteration will stop
    after max_iter iterations or an error tolerance of
    number_of_nodes(G)*tol has been reached.

    The PageRank algorithm was designed for directed graphs but this
    algorithm does not check if the input graph is directed and will
    execute on undirected graphs by converting each edge in the
    directed graph to two edges.

    See Also
    --------
    pagerank_numpy, pagerank_scipy, google_matrix

    References
    ----------
    .. [1] A. Langville and C. Meyer,
       "A survey of eigenvector methods of web information retrieval."
       http://citeseer.ist.psu.edu/713792.html
    .. [2] Page, Lawrence; Brin, Sergey; Motwani, Rajeev and Winograd, Terry,
       The PageRank citation ranking: Bringing order to the Web. 1999
       http://dbpubs.stanford.edu:8090/pub/showDoc.Fulltext?lang=en&doc=1999-66&format=pdf
    """

次に、ソースコード分析ブログのソースコードで反復式の説明を抽出します。

PR = alpha *(A * PR +ぶら下がり分布)+(1-alpha)*偶数分布

3つの部分があります。A* PRは実際にはグラフマトリックスによって割り当てられ、ダングリング割り当てはダングリングノードのPR値を割り当てることであり、(1-alpha)割り当ては各人に世界によって割り当てられます。

ぶら下がりノードはぶら下がりノードです。そのアウトディグリーは0であるため、他のノードに到達できません。解決策は、ある程度のランダム性を高めることです。ぶら下がり分布は、実際にはランダムベクトルを追加することです。つまり、これから導出することはできません。ノードは他のノードに移動しますが、ランダムにノードに再移動する場合があります。Webサイトに到達したときに、WebサイトはどのWebサイトにも接続されていませんが、閲覧者はランダムにページを再度開く場合があることも理解できます。

実際、素人の言葉で言えば、PageRankは、3つのスナッチングメカニズムを備えたスナッチング競争と見なすことができます。

1. A * PRは自由に配布され、誰もが競争力のある取引所の配布に積極的に参加します

2.ぶら下がりは、地元の暴君を倒して土地を分割する感覚に似た強制配布です。フリーマーケットに参加しない場合は、強制配布をお手伝いします。

3.均等な分配。実際、誰もが共産主義を実現する機会があります。ランクシンクを生成するノードなどのスパイダートラップに油や水を過剰に与えないでください。実際、客観的には、ぶら下がっている分配にも役立ちます。

グラフとマトリックスの観点から、このマトリックスは有向グラフとして見ることができることが理解できます。

マトリックスは収束する必要があります->マトリックスには一意のソリューションがあります-> n次の正方形のマトリックスは有向グラフに対応します強く接続されています-> 2つのノードは相互に到達可能で、1は2に到達でき、2は1に到達できます

それが強く結びついたグラフである場合、これは前述の最初のケースであり、自由な競争であり、収束していることを確認できます。

そうしないと、スパイダートラップがランクシンクの問題を引き起こします

上記の反復式は、以前のすべての反復式とは異なることがわかります。
ここに写真の説明を挿入
ここに写真の説明を挿入
networkxの反復式には、追加のぶら下がり割り当てがあり、他はまったく同じです。最初は、ぶら下がりの割り当てが不要だと感じたので、少しわかりづらかったです。ぶら下がりノードの問題を解決するには、最後にランダムな割り当てで十分です。ランダムな割り当てとは、新しいものにランダムにジャンプする可能性があることを意味します。ページ。次に、ソースコードのこの部分のキーコードを見て、pr値が繰り返し更新される方法を詳しく見てみましょう。

for _ in range(max_iter):
    xlast = x
    x = dict.fromkeys(xlast.keys(), 0)  #x初值
    danglesum = alpha * sum(xlast[n] for n in dangling_nodes) #第2部分:计算dangling_nodes的PR总值
    for n in x:        
        for nbr in W[n]:
            x[nbr] += alpha * xlast[n] * W[n][nbr][weight]    #第1部分:将节点n的PR资源分配给各个节点,循环之
    for n in x:         
        x[n] += danglesum * dangling_weights[n] + (1.0 - alpha) * p[n]   #第3部分:节点n加上dangling nodes和均分的值
 
    # 迭代检查
    err = sum([abs(x[n] - xlast[n]) for n in x])
    if err < N*tol:
        return x

上記のソースコードから、最初にダングルサムが計算されていることがわかります。つまり、ダングリングノードのすべてのpr値が合計され、合計されます。x[nbr] + = alpha * xlast [n] * W [n] [nbr] [weight]これは、pr値のループ反復です。x[n] + = danglesum * dangling_weights [n] +(1.0-alpha)* p [n]これには2つの部分が含まれます。(1.0-alpha)* p [n]は簡単です。理解は等分布でなければなりません。前の分布はぶら下がり分布、つまりぶら下がりノードの重みにぶら下がり合計を掛けたものです。指定されていない場合、すべてのノードの重みは同じで、1 / Nになります。

3.ステートメントと2つの例の正しさを確認します

この部分は、ステートメントの正確性とnetworkxのそのような実装の利点を検証することであり、後で例を示します。
グラフ構造を想定します
ここに写真の説明を挿入
。AはBを指す、つまりBがぶら下がっているノードである合計2つのノードがあります。この場合、上図に示すように、networkxのページランクを使用してpr値を計算します。これらの2つのpr値を計算するための反復式が実際にPR = alpha *(A * PR +ぶら下がり分布)+(1-alpha)*偶数分布であることを確認する方法は?計算されたpr値をこの式に代入するだけで、反復を実行できます。別の反復後に取得された値もこの値である場合、この反復式が実際に使用されていることを意味します。
PR(A)= alpha ∗(A ∗ PR +ぶら下がり分布)+(1 − alpha)∗平均分布= 0.85 ∗ 0.5 ∗ 0.649123 + 0.15 / 2 = 0.350877 PR(A)= alpha *(A * PR +ぶら下がり分布) )+(1-alpha)*平均分布= 0.85 * 0.5 * 0.649123 + 0.15 / 2 = 0.350877P R A =a l p h aAP R+D A n- G L I n- Gフラクション分布+1a l p h a pingを実行、すべての点を=0 8 50 50 6 4 9 1 2 3+0 1 5 / 2=0 3 。5 0 。8 。7 。7
PR(B)=アルファ*(A * PR +ダングリング割り当て後)+(1 -アルファ)*均一= 0.350877 + 0.85 * 0.35087 = 0.649123PR +ぶら下がり分布)+(1-アルファ)*平均分布= 0.350877 + 0.85 * 0.35087 = 0.649123P R B =a l p h aAP R+D A n- G L I n- Gフラクション分布+1a l p h a pingを実行、すべての点を=0 3 5 0 8 7 7+0 8 50 3 5 0 8 7=0 6 。4 。9 。1 2 。3
実際、及び上記で得られた証明と一致します。

リンク2のブログ投稿にある反復式を使用して計算します。
前の計算方法を使用して計算することができます。つまり、次の反復式を使用
ここに写真の説明を挿入
できます。初期値prは0.5で、最終値は次のようになります。検出は正規化されていません。
PR(A)= 0.15 / 2 = 0.075 PR(A)= 0.15 / 2 = 0.075P R A =0 1 5 / 2=0 0 7 5
PR(B)= 0.15 / 2 + 0.85 ∗ 0.075 = 0.13875 PR(B)= 0.15 / 2 + 0.85 * 0.075 = 0.13875P R B =0 1 5 / 2+0 8 50 0 7 5=0 1 。3 。8 。7 。5
正規化後、驚くべき結果とnetworkx出力が一致しています。
それで、これは偶然ですか?そこで、次の図に示すように、3つのノードを使用して実験しました。
ここに写真の説明を挿入
また、上記と同じ方法を使用して実験しました。ソースコード分析で式を使用して計算すると、上記のPR値を取得し、リンク2を使用することがわかりました。ブログ投稿で式を計算して値を正規化した後でも、同じ結論が得られます。つまり、計算結果はnetworkxによって出力された結果と一致します。

4.推測と結論

したがって、上記の2つの実験を要約すると、ソースコード分析のPR反復式は、次の図のPR計算反復式と同じであると思います。
ここに写真の説明を挿入
2つの違いは、ソースコード解析での式の最後の反復が直接正規化されたPR値であり、上の図の式を使用した反復計算が正規化されていない値であるということだけですが、結果はまったく同じです。
理論的な導出から証明できないのは残念です。誰かが私にアドバイスをくれたら、つまり、次の2つの式が同じ効果をもたらす理由を教えていただければ幸いです。

ここに写真の説明を挿入

ここに写真の説明を挿入


補足:上記の例のコードの接続を取得します

おすすめ

転載: blog.csdn.net/qq_39805362/article/details/106956210