2017-02-10 47 views
3

Мы пытаемся перенести приложение python в .Net/Windows. В исходном приложении используется реализация NetworkX pagerank.Несоответствие между результатами в pagerank Networkx vs iGraph

Когда мы запускаем исходный код для набора данных ниже, мы получаем один набор результатов, когда мы запускаем то же, что мы считаем одним и тем же набором данных, используя iGraph pagerank, мы получаем другой набор результатов.

Может ли кто-нибудь просмотреть приведенные ниже данные и дать нам некоторое представление о том, что может вызвать разрыв?

Запуск Graph

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] 

Результаты бегущие Pagerank с использованием NetworkX

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

Запуск Pagerank использованием iGraph

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 

Любое руководство вы можете обеспечить будет весьма признателен.

ответ

2

Существует несколько вещей, приводящих к различиям в рейтинге страниц. Во-первых, граф 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 говорит он использует метод питания. Однако использование метода мощности для igraph дает разные результаты. Использование arpack или prpack дает аналогичные результаты.