有没有办法在NetworkX的MultiGraph上运行pagerank算法?

时间:2015-02-17 11:27:35

标签: python algorithm networkx pagerank

我正在处理一个在同一节点之间有多个边的图(边有不同的值)。为了模拟这个图,我需要使用MultiGraph而不是普通的Graph。不幸的是,不可能在其上运行PageRank算法。

任何已知的解决方法?

NetworkXNotImplemented: not implemented for multigraph type

2 个答案:

答案 0 :(得分:7)

您可以创建一个没有平行边的图形,然后运行pagerank。 下面是一个求和平行边缘权重的例子,以制作一个简单的图形:

import networkx as nx
G = nx.MultiGraph()
G.add_edge(1,2,weight=7)
G.add_edge(1,2,weight=10)
G.add_edge(2,3,weight=9)

# make new graph with sum of weights on each edge
H = nx.Graph()
for u,v,d in G.edges(data=True):
    w = d['weight']
    if H.has_edge(u,v):
        H[u][v]['weight'] += w
    else:
        H.add_edge(u,v,weight=w)

print H.edges(data=True)
#[(1, 2, {'weight': 17}), (2, 3, {'weight': 9})]
print nx.pagerank(H)
#{1: 0.32037465332634, 2: 0.4864858243244209, 3: 0.1931395223492388}

答案 1 :(得分:0)

您仍然可以通过组合边缘来构成有向图 同时增加他们的体重。

# combining edges using defaultdict
# input-- combined list of all edges
# ouput-- list of edges with summed weights for duplicate edges
from collections import defaultdict  
def combine_edges(combined_edge_list):    
    ddict = defaultdict(list)

    for edge in combined_edge_list:
        n1,n2,w = edge
        ddict[(n1,n2)].append(w)
    
    for k in ddict.keys():
        ddict[k] = sum(ddict[k])
    
    edges = list(zip( ddict.keys(), ddict.values() ) )    

    return [(n1,n2,w) for (n1,n2),w in edges]