Центральности в сетевом весовом графике

Я не могу вычислить центральности для простого взвешенного графа NetworkX.
Это нормально или я скорее что-то не так делаю?

Я добавляю края простым add_edge(c[0],c[1],weight = my_values), где c[0],c[1] являются строками (именами узлов) и my_values целые числа, внутри цикла for. Это пример результирующих ребер:

('first node label', 'second node label', {'weight': 14})

(количество узлов на самом деле не имеет значения - пока я оставляю его только 20)

Список ребер моего графа - это список кортежей, с (string_node1,string_node2,weight_dictionary) - все выглядит хорошо, так как я также могу рисовать / сохранять / читать / граф...

Зачем?:

  • nx.degree_centrality дает мне все 1с?
  • nx.closeness_centrality дает мне все 1с?

пример:

{'first node name': 1.0,
...
'last node name': 1.0}

Спасибо за вашу помощь.

2 ответа

Решение

Это было легко:

Вместо того, чтобы использовать nx.degree_centrality() я использую my_graph.degree(weight='weight') - все же я думаю, что это основной недостаток в модуле...

... но проблема все еще открыта для nx.closeness_centrality

Для изготовления closeness_centrality учитывайте вес, вы должны добавить distance атрибут 1 / weight на грани ребер, как предлагается в этом выпуске.

Вот код, чтобы сделать это (график g):

g_distance_dict = {(e1, e2): 1 / weight for e1, e2, weight in g.edges(data='weight')}
nx.set_edge_attributes(g, g_distance_dict, 'distance')

Я знаю, что это довольно старый вопрос, но просто хотел указать, что причина, по которой ваши значения центральности степени равны 1, вероятно, потому, что ваш график завершен (то есть все узлы подключены к каждому другому узлу), а центральность степени относится к пропорционально доле узлов в графе, с которыми узел связан.

В документации по networkx:

Степень центральности для узла v - это доля узлов, с которыми он связан.

Значения степени центральности нормализуются путем деления на максимально возможную степень в простом графе n-1, где n - количество узлов в G.

Другие вопросы по тегам