2014-11-01 6 views
0

NetworkX에서 역방향 다이 그래프의 전체 복사본을 만들고 그 복사본의 PageRank를 조사 할 때 문제가 있습니다. 문제가 PageRank에있는 것처럼 보이지는 않습니다. 단절된 역 분극 그래프의 PageRank를 계산할 때 예외가 발생합니다.NetworkX - 역전 된 그래프의 딥 복사본 만들기

먼저이 코드를 사용하여 무작위로 노드를 만들고 그 중 몇 개를 무작위로 선택한 다음 해당 노드에서 다른 50 개 또는 무작위로 선택된 노드로 향하는 가장자리를 그립니다.

G = global_classroom(1000) 
G.reverse(False) 
print nx.pagerank(G) 

모든 것을 완벽하게 잘 작동 :이 호출하면 그 다음, 지금

def global_classroom(nodes): 
    network = nx.DiGraph() 
    network.add_nodes_from([User(i, "0.0.1") for i in range(nodes)]) 
    network_nodes = network.nodes() 
    teachers = random.sample(network_nodes, nodes/100) 
    for teacher in teachers: 
     for i in range(nodes/20): 
      student = network_nodes[random.randrange(nodes)] 
      if teacher != student: 
      network.add_edge(teacher, student) 
    for node in network_nodes: 
     if network.degree(node) == 0: 
      network.remove_node(node) 
    return network 

정도를 0에서 모든 노드를 트림. NetworkX는 아무 문제없이 PageRank를 계산할 수 있습니다.

하지만이를 호출하는 경우 :

G = global_classroom(1000) 
G_page_rank = G.reverse() 
nx.pagerank(G_page_rank) 

<__main__.User object at 0x104618050> 내 소리를 나타내는 두 글자의 노드를 구성하는 많은 개체 중 하나입니다

Traceback (most recent call last): 
    File "a.py", line 62, in <module> 
    rank = nx.pagerank(L_page_rank) 
    File "<string>", line 2, in pagerank 
    File "/Users/PSnyder/Documents/Git/infection/networkx/utils/decorators.py", line 68, in _not_implemented_for 
    return f(*args,**kwargs) 
    File "/Users/PSnyder/Documents/Git/infection/networkx/algorithms/link_analysis/pagerank_alg.py", line 140, in pagerank 
    dangling_nodes = [n for n in W if W.out_degree(n, weight=weight) == 0.0] 
    File "/Users/PSnyder/Documents/Git/infection/networkx/classes/digraph.py", line 1023, in out_degree 
    return next(self.out_degree_iter(nbunch,weight))[1] 
    File "/Users/PSnyder/Documents/Git/infection/networkx/classes/digraph.py", line 941, in out_degree_iter 
    for n,nbrs in nodes_nbrs: 
    File "/Users/PSnyder/Documents/Git/infection/networkx/classes/digraph.py", line 934, in <genexpr> 
    nodes_nbrs=((n,self.succ[n]) for n in self.nbunch_iter(nbunch)) 
    KeyError: <__main__.User object at 0x104618050> 

던져 예외가있다.

그래프를 원래대로 되돌리려면 그래프를 다시 뒤집을 필요없이 간단하게 전체 복사본을 만들 수 있습니다.

class User(object): 
    def __init__(self, name, version, teachers = [], students = []): 
     self.name = name 
     self.version = version 
     G.add_node(self) 
     self.add_teachers(teachers) 
     self.add_students(students) 

    def add_students(self, students): 
     for student in students: 
      G.add_edge(self, student) 

    def add_teachers(self, teachers): 
     for teacher in teachers: 
      G.add_edge(teacher, self) 
+1

방금 ​​복사를 반대로 다음 (') copy.deepcopy (G'와) 별도로 그래프의 깊은 복사본을 만들어 수 없습니다 (() 대신 사용자의 정수를 사용하여) 작동 ? – BrenBarn

+0

왜 그래, 할 수있어! 이상하지만 작동하지만 nx.reverse (G)는 그렇지 않습니다. –

답변

1

어쩌면 당신의 사용자 객체가 문제를 일으키는 : 여기

내 노드를 구성하는 사용자 클래스의 전체입니까? 당신은 그것을 포함하지 않았으므로 이것이 networkx 버그인지 아닌지 알 수 없습니다.

import networkx as nx 
import random 

def global_classroom(nodes): 
    network = nx.DiGraph() 
    network.add_nodes_from([i for i in range(nodes)]) 
    network_nodes = network.nodes() 
    teachers = random.sample(network_nodes, nodes/100) 
    for teacher in teachers: 
     for i in range(nodes/20): 
      student = network_nodes[random.randrange(nodes)] 
      if teacher != student: 
       network.add_edge(teacher, student) 
    for node in network_nodes: 
     if network.degree(node) == 0: 
      network.remove_node(node) 
    return network 


if __name__=='__main__': 
    G = global_classroom(1000) 
    G.reverse(False) 
    print nx.pagerank(G).items()[0:5] # first 5 
+0

위의 User 클래스 코드가 추가되었습니다. 내'add_students'와'add_teachers' 메쏘드가 재미있는 일을하고 있을지도 모릅니다. (그렇다면 그래프를 생성 할 때 절대로 호출하지 않기 때문에 다시는 그렇지 않습니다.) –

관련 문제