我正在尝试实现一种简单的算法,该算法将在使用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。
这样的事情从一开始就可行吗?我应该在其他地方实现这种算法吗?如果应用这样的更改,会不会出现收敛问题?预先感谢。
答案 0 :(得分:0)
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
,则会因为收敛而被破坏:
将永远不会被假定(e
在每次迭代中都在增加)。如果要使用1
作为起始值,如原始的PageRank算法一样:
在原始形式的PageRank中,所有页面上的PageRank的总和就是当时网络上的页面总数,因此此示例中的每个页面的初始值为1。
由于不推荐使用整个算法,因此应手动实施。