Вот как я бы подошел к этой проблеме, насколько я понял, это то, что вы пытаетесь достичь.Кажется, вы сначала хотите найти подключенные компоненты из списка ребер.Для этого в networkX
есть специальная функция.
Давайте рассмотрим следующий пример:
l = [(1,2),(1,2),(1,4),(2,4),(2,5),(2,6),(7,8),(9,7),(1,2)]
Построим сеть из приведенного выше списка.Для обобщения я учитываю вес.Где вес будет равен количеству раз, когда заданное ребро появляется:
import networkx as nx
from collections import Counter
from operator import itemgetter
G = nx.Graph()
weighted_edges = [(*i,j) for i,j in Counter(l).items()]
# [(1, 2, 3), (1, 4, 1), (2, 4, 1), (2, 5, 1), (2, 6, 1), (7, 8, 1), (9, 7, 1)]
G.add_weighted_edges_from(weighted_edges)
Теперь мы можем получить связанные компоненты с nx.connected_components
:
cc = nx.connected_components(G)
print(list(cc))
# [{1, 2, 4, 5, 6}, {7, 8, 9}]
Учитывая, что мы хотим получить меру того, насколько репрезентативен узел / ребро в данном компоненте, можно было бы посмотреть на degree
узлов.Где:
Степень узла - это число ребер, смежных с узлом
Итак, что мы можем сделать, это перебрать подключенные компоненты и найти узел свысшая центральность.Вот один из способов:
degree_cen = G.degree()
out = []
while True:
try:
component = next(cc)
component_cen = {k: degree_cen[k] for k in component}
center_node = max(component_cen.items(), key=itemgetter(1))[0]
out.append({'component':component, 'center_node':center_node})
except StopIteration:
break
Что дает:
print(out)
# [{'component': {1, 2, 4, 5, 6}, 'center_node': 2},
# {'component': {7, 8, 9}, 'center_node': 7}]