具有自定义初始得分的PageRank

时间:2019-06-20 09:40:50

标签: python-3.x networkx graph-theory social-networking pagerank

我正在尝试实现一种简单的算法,该算法将在使用NetworkX生成和处理的定向网络上计算PageRank。但是,我想添加一个简单的更改:而不是让每个节点的初始PageRank等于1 / n,其中n是图中的节点数,我希望每个节点的排名为1。

到目前为止,我已经尝试查看PageRank上的官方文档,但是我发现似乎没有任何帮助。显然,“个性化”参数也没有用。我尝试使用nstart,但无济于事。当前代码如下:

import networkx as nx

D=nx.DiGraph()
D.add_weighted_edges_from([('1','2',0.5),('1','3',0.5)])
nst = {n: 1 for n in D.nodes}

print(nx.pagerank(D, alpha = 0.95, nstart=nst))

目前,在计算结束时分配给每个节点的等级仍为1,而其等级应为3。

这样的事情从一开始就可行吗?我应该在其他地方实现这种算法吗?如果应用这样的更改,会不会出现收敛问题?预先感谢。

1 个答案:

答案 0 :(得分:0)

networkx中的

PageRank具有属性 nstart

  

nstart (字典,可选)–每个节点的PageRank迭代的起始值。

这是此代码:

    # Choose fixed starting vector if not given
    if nstart is None:
        x = dict.fromkeys(W, 1.0 / N)
    else:
        # Normalized nstart vector
        s = float(sum(nstart.values()))
        x = dict((k, v / s) for k, v in nstart.items())

您只需在代码中指定 nstart 即可,

nst = {n: 1 for n in G.nodes}
pr = nx.pagerank(G, nstart=nst)

编辑1::现代PageRank算法强制normalizes start vector(您可以在上面的代码中看到它)。整个算法都基于该算法,如果将 nstart 值强制为1,而不是1/N,则会因为收敛而被破坏:

enter image description here

将永远不会被假定(e在每次迭代中都在增加)。如果要使用1作为起始值,如原始的PageRank算法一样:

  

在原始形式的PageRank中,所有页面上的PageRank的总和就是当时网络上的页面总数,因此此示例中的每个页面的初始值为1。

由于不推荐使用整个算法,因此应手动实施。