Центральности в сетевом весовом графике
Я не могу вычислить центральности для простого взвешенного графа 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, вероятно, потому, что ваш график завершен (то есть все узлы подключены к каждому другому узлу), а центральность степени относится к пропорционально доле узлов в графе, с которыми узел связан.
Степень центральности для узла v - это доля узлов, с которыми он связан.
Значения степени центральности нормализуются путем деления на максимально возможную степень в простом графе n-1, где n - количество узлов в G.