Как добавить длину ребра в качестве веса между центральностью, используя OSMNx / Networkx? - PullRequest
1 голос
/ 07 мая 2019

Я использую библиотеку Python OSMNx, чтобы получить центральность заданной уличной сети G. Создайте то, что я вижу, модуль osmnx.stats.extended_stats (G, bc = True) вычисляет междуМодуль NetworkX networkx.betweenness_centrality (G, нормализовано = True, вес = нет) установка всех весов ребер равными.Поскольку длина ребра уже вложена в G, было бы просто использовать ее в качестве веса.Тем не менее я не могу найти способ сделать это.

Как я могу установить вес равным 1 / длина, используя эти две библиотеки?

Пожалуйста, рассмотрите график, приведенный в следующем примере

import osmnx as ox
import networkx as nx

#Using OSMNx
G = ox.graph_from_bbox(37.79, 37.78, -122.41, -122.43, network_type='drive')
stats = ox.extended_stats(G,bc=True)
bet1 = stats["betweenness_centrality"]

#Using NetworkX
bet2 = nx.betweenness_centrality(G, weight=None)

Вот что ядо сих пор пытался:

import pandas as pd

l = nx.get_edge_attributes(G, 'length')
l = pd.Series(l).to_frame()
w=1/l
w = w.to_dict(orient="index")
nx.set_edge_attributes(G, w, 'w')
bet3 = nx.betweenness_centrality(G, weight='w')

Но я прихожу к тому же результату, что и без использования весов.

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Вы обнаружили ошибку в networkx обработке MultiDiGraph в алгоритмах кратчайшего пути. Смотрите следующий пример:

import networkx as nx

graph = nx.Graph()
graph.add_weighted_edges_from([(1,2,1), (2,3,2), (1,3,1)])
print(nx.betweenness_centrality(graph))
# {1: 0.0, 2: 0.0, 3: 0.0}
print(nx.betweenness_centrality(graph, weight="weight"))
# {1: 0.5, 2: 0.0, 3: 0.0}


multi_di_graph = nx.MultiDiGraph()
multi_di_graph.add_weighted_edges_from([(1,2,1), (2,3,2), (1,3,1)])
print(nx.betweenness_centrality(multi_di_graph))
# {1: 0.0, 2: 0.0, 3: 0.0}
print(nx.betweenness_centrality(multi_di_graph, weight="weight"))
# {1: 0.0, 2: 0.0, 3: 0.0}

Ошибка в _single_source_dijkstra_path_basic особенно следующие строки кода

for w, edgedata in G[v].items():
    vw_dist = dist + edgedata.get(weight, 1)

Я не уверен, должны ли алгоритмы кратчайшего пути в networkx работать для мультиграфа, но так как я не нашел примечания, я думаю, что это ошибка. Я бы посоветовал вам открыть проблему на networkx GitHub . Если это возможно для рассматриваемой части, вы можете подумать и о обычном DiGraph.

0 голосов
/ 08 мая 2019

модуль osmnx.stats.extended_stats (G, bc = True) вычисляет промежуточность с использованием модуля NetworkX networkx.betweenness_centrality (G, normalized = True, weight = None), устанавливая все веса ребер равными.Поскольку длина ребра уже встроена в G, было бы просто использовать его в качестве веса.

OSMnx автоматически использует длины ребер в качестве веса при вычислении центральности промежуточности.Для дальнейшей настройки вы можете просто вызвать nx.betweenness_centrality(G) непосредственно в вашем графическом объекте OSMnx и настроить его по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...