[英]Is there a way to run pagerank algorithm on NetworkX's MultiGraph?
我正在處理同一節點之間具有多條邊的圖(邊具有不同的值)。 為了對這個圖進行建模,我需要使用 MultiGraph 而不是普通的 Graph。 不幸的是,無法在其上運行 PageRank 算法。
任何已知的解決方法?
NetworkXNotImplemented: not implemented for multigraph type
您可以創建一個沒有平行邊的圖形,然后運行 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}
您仍然可以通過在添加權重的同時組合邊來組成有向圖。
# 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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.