gpt4 book ai didi

python - 如何使用 OSMNx/Networkx 添加边长度作为中间中心性的权重?

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:57 25 4
gpt4 key购买 nike

我正在使用Python库OSMNx来获取给定街道网络G的介数中心性。从我所看到的来看,模块osmnx.stats.extended_stats(G, bc=True)使用 NetworkX 模块计算介数 networkx.betweenness_centrality(G, normalized=True, weight=None)将所有边权重设置为相等。由于边长已经嵌入到 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')

但是我得到的结果与不使用权重的结果完全相同。

最佳答案

您在最短路径算法中检测到 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特别是以下code lines

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

我不确定networkx中的最短路径算法是否适用于多重图,但由于我没有发现任何注释,我认为这是一个错误。我建议您在networkx GitHub上打开一个问题。如果相关部分可能,您也可以考虑转换为通常的DiGraph

关于python - 如何使用 OSMNx/Networkx 添加边长度作为中间中心性的权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56028683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com