Взвешенная бимодальная проекция двудольного графа с сохранением исходных весов
У меня есть большой ( 36k вершин, 50k ребер) взвешенный бимодальный двудольный граф, и я хотел бы создать проекцию, которая не только подсчитывает соседей, как взвешенная реализация по умолчанию, но и суммирует веса на ребрах. Вы можете думать о нем как о двудольном графе, содержащем черные вершины и синие вершины, где я хочу сохранить исходные веса графа, когда есть только синие вершины.
Реализации, с которыми я сталкивался, сохраняют значение оранжевого цвета, я интересуюсь красным (или, надеюсь, получим двунаправленную проекцию).
Я до сих пор смотрел на igraph, networkx и python-tool, но до сих пор я наблюдал только проекцию, подсчитывающую количество ребер.
Метод Networkx generic_weighted_projected_graph(B, node, weight_function=None) может сделать это жизнеспособным, но я не понимаю, как это сделать (sna является новым для меня, хотя я и так питонский пользователь).
1 ответ
В документации, на которую вы ссылаетесь по адресу https://networkx.github.io/documentation/latest/reference/generated/networkx.algorithms.bipartite.projection.generic_weighted_projected_graph.html есть пример того, как именно это сделать.
Это выглядит так:
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})]