python - pagerank Networkx 与 iGraph 的结果不一致

标签 python igraph networkx pagerank

我们正在尝试将 python 应用程序移植到 .Net/Windows。原始应用程序使用了 pagerank 的 NetworkX 实现。

当我们为下面的数据集运行原始代码时,我们得到了一组结果,当我们使用 iGraph pagerank 运行我们认为是相同数据集的代码时,我们得到了不同的结果集。

任何人都可以查看下面的数据并告诉我们可能导致断开连接的原因吗?

起始图

From , To, Weight
------------------------------------------
[1, 2, 1.237635735532509]
[1, 3, 1.3176784432060453]
[2, 5, 0.1]
[2, 7, 1.6545276334003642]
[3, 0, 0.4013877113318902]
[3, 5, 0.9056698458264134]
[3, 7, 3.4462871026284194]
[4, 5, 0.9693717489378296]
[4, 7, 1.3176784432060453]
[5, 7, 1.6053605156578263]
[7, 2, 0.8068528194400547]
[7, 3, 0.9771288098085582]
[7, 4, 4.317678443206045]
[7, 5, 2.0108256237659905]

使用 NetworkX 运行 Pagerank 的结果

0: 0.030658861877660655
1: 0.025151437717922904
2: 0.06899335192504014
3: 0.0767301059609998
4: 0.20435115331218195
5: 0.19799952556413375
7: 0.39611556364206074

使用 iGraph 运行 Pagerank

h = Graph()
h.add_vertices([0,1,2,3,4,5,6,7])
h.add_edge(1, 2, weight = 1.237635735532509)
h.add_edge(1, 3, weight = 1.3176784432060453)
h.add_edge(2, 5, weight = 0.1)
h.add_edge(2, 7, weight = 1.6545276334003642)
h.add_edge(3, 0, weight = 0.4013877113318902)
h.add_edge(3, 5, weight = 0.9056698458264134)
h.add_edge(3, 7, weight = 3.4462871026284194)
h.add_edge(4, 5, weight = 0.9693717489378296)
h.add_edge(4, 7, weight = 1.3176784432060453)
h.add_edge(5, 7, weight = 1.6053605156578263)
h.add_edge(7, 2, weight = 0.8068528194400547)
h.add_edge(7, 3, weight = 0.9771288098085582)
h.add_edge(7, 4, weight = 4.317678443206045)                   
h.add_edge(7, 5, weight = 2.0108256237659905)

z = h.pagerank()

返回....

0.08263947646845539 
0.11209944263156851 
0.13863513488523824 
0.2088786898834253 
0.0909928717668216 
0.15533634946784883 
0.04713009918827309 
0.16428793570836897

pagerank(None,True,.85,'weight',None,'prpack',1000,.001) 返回,

0.06306529189761995
0.1213272777521786
0.12419698504275958
0.21601479253860403
0.0845752983652644
0.10892203451714054
0.05260867410276095
0.22928964578367186

pagerank(None,True,.85,'weight',None,'power',1000,.001) 返回,

0.05046861007484653
0.08032641955693953
0.1387381559084609
0.18249744338552665
0.10389267832310527
0.16623355776440546
0.019058750577540366
0.2587843844091753

如果您能提供任何指导,我们将不胜感激。

最佳答案

有几件事导致了页面排名的差异。首先,networkx 图没有节点 6(隔离),但 igraph 图有。其次,确保 igraph 图是有向的。当您这样做时,页面排名分数几乎相同(至少在小数点后第 6 位左右)。

import igraph as ig
import networkx as nx
G=nx.DiGraph()
G.add_nodes_from([0,1,2,3,4,5,6,7]) #Add node 6
G.add_edge(1, 2,weight= 1.237635735532509)
G.add_edge(1, 3,weight= 1.3176784432060453)
G.add_edge(2, 5,weight= 0.1)
G.add_edge(2, 7,weight= 1.6545276334003642)
G.add_edge(3, 0,weight= 0.4013877113318902)
G.add_edge(3, 5,weight= 0.9056698458264134)
G.add_edge(3, 7,weight= 3.4462871026284194)
G.add_edge(4, 5,weight= 0.9693717489378296)
G.add_edge(4, 7,weight= 1.3176784432060453)
G.add_edge(5, 7,weight= 1.6053605156578263)
G.add_edge(7, 2,weight= 0.8068528194400547)
G.add_edge(7, 3,weight= 0.9771288098085582)
G.add_edge(7, 4,weight= 4.317678443206045)
G.add_edge(7, 5,weight= 2.0108256237659905)

h = ig.Graph(directed = True)  #Ensure the graph is directed
h.add_vertices([0,1,2,3,4,5,6,7])
h.add_edge(1, 2, weight = 1.237635735532509)
h.add_edge(1, 3, weight = 1.3176784432060453)
h.add_edge(2, 5, weight = 0.1)
h.add_edge(2, 7, weight = 1.6545276334003642)
h.add_edge(3, 0, weight = 0.4013877113318902)
h.add_edge(3, 5, weight = 0.9056698458264134)
h.add_edge(3, 7, weight = 3.4462871026284194)
h.add_edge(4, 5, weight = 0.9693717489378296)
h.add_edge(4, 7, weight = 1.3176784432060453)
h.add_edge(5, 7, weight = 1.6053605156578263)
h.add_edge(7, 2, weight = 0.8068528194400547)
h.add_edge(7, 3, weight = 0.9771288098085582)
h.add_edge(7, 4, weight = 4.317678443206045)                   
h.add_edge(7, 5, weight = 2.0108256237659905)

现在,检查页面排名:

>>> h.pagerank(None,True,.85,'weight',None,'arpack')
[0.02990667328959136,
 0.02453435976169968,
 0.06730062757414129,
 0.07484756185358077,
 0.199337429914656,
 0.19314195829041825,
 0.02453435976169968,
 0.38639702955421296]
>>> nx.pagerank(G,alpha=0.85,weight = 'weight')
{0: 0.029906698992551148,
 1: 0.02453435614919296,
 2: 0.06730055444151634,
 3: 0.07484747242070261,
 4: 0.19933699472630276,
 5: 0.19314246522466136,
 6: 0.02453435614919296, #Here is node 6, missing from your example
 7: 0.3863971018958797}

对我来说一个谜是 networkx 的文档说它使用 power 方法。但是,对 igraph 使用 power 方法会产生不同的结果。使用 arpackprpack 产生基本相似的结果。

关于python - pagerank Networkx 与 iGraph 的结果不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42160566/

相关文章:

python - 将 pandas 数据框嵌套列表拆分为新的命名列

R图度数分布不起作用

python - 使用 Networkx 进行有向图遍历

python - 如何将时间分布式层与卷积层一起使用?

javascript - Django,如何强制返回ajax错误?

python - 如何在 pandas 中检查元素是否在数组列中

r - 如何计算点之间的最近距离?

r - igraph 中的颜色特定节点

python - 如何从python中的有向无环图中查找边缘层次图

python - 基于边缘宽度的 matplotlib 图例