2014-12-03 7 views
1

У меня есть большой (36k вершин, 50 к краев) взвешенный бимодальный двудольный граф, и я бы хотел создать проекцию, которая не только учитывала бы соседей, как и взвешенную по умолчанию реализацию, но и суммировала веса по краям. Вы можете рассматривать это как двудольный граф, содержащий черные вершины и синие вершины, где я хочу сохранить исходные веса графа, когда есть только синие вершины.Взвешенная бимодальная двудольная диаграмма Проекция, сохраняющая исходные веса

enter image description here

Реализации я натолкнулась сохранить оранжевую значение, я заинтересован в красной (или с надеждой получить би-взвешенный прогноз).

Я так долго смотрел в igraph, networkx и python-tool, но пока наблюдал только проецирование количества ребер.

Networkx method generic_weighted_projected_graph(B, nodes, weight_function=None) может сделать это жизнеспособным, но я не вижу, как (sna для меня новичок, хотя я такой пользователь python).

ответ

1

В документации, приведенной на странице , приведен пример того, как это сделать.

Это выглядит следующим образом:

import networkx as nx 
from networkx.algorithms import bipartite 

edges = [('A1','B1',3), 
     ('A1','B2',7), 
     ('A2','B1',2), 
     ('A2','B2',4), 
     ] 

B = nx.Graph() 
B.add_weighted_edges_from(edges) 

def my_weight(G, u, v, weight='weight'): 
    w = 0 
    for nbr in set(G[u]) & set(G[v]): 
     w += G.edge[u][nbr].get(weight, 1) + G.edge[v][nbr].get(weight,1) 
    return w 

G = bipartite.generic_weighted_projected_graph(B, ['A1', 'A2'], weight_function=my_weight) 


print G.edges(data=True) 

выход

[('A1', 'A2', {'weight': 16})] 
+0

Wow> (я предполагаю, что я неправильно понял код там Спасибо за указание на это –

+0

Если кто-нибудь сталкивался это с тем же самым.! вопрос, убедитесь, что граф неориентирован (что он пытается применить двудольную проекцию). Хотя igraph игнорирует, если он направлен и переходит к проекции, это просто вернет список пустых узлов. Существует метод на графе, который может быть вызван G2 = G.to_undirected(), который повернется он неориентирован и решает проблему. –