如何使用 OSMNx/Networkx 添加边长作为中间中心性的权重?
How to add edge length as a weight in betweeness centrality using OSMNx/Networkx?
我正在使用 Python 库 OSMNx 来获取给定街道网络 G 的介数中心性。根据我的观察,模块 osmnx.stats.extended_stats(G, bc=True) computes betweenness using NetworkX module 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')
但我得到的结果与不使用权重完全相同。
the module osmnx.stats.extended_stats(G, bc=True) computes betweenness using NetworkX module networkx.betweenness_centrality(G, normalized=True, weight=None) setting all edge weights as equal. Since the edge length is already embedded in G, it would be straightforward to use it as a weight.
OSMnx automatically uses edge lengths作为计算中介中心性时的权重。对于任何进一步的自定义,您可以直接在您的 OSMnx 图形对象上调用 nx.betweenness_centrality(G)
,并根据需要对其进行参数化。
您检测到 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 来获取给定街道网络 G 的介数中心性。根据我的观察,模块 osmnx.stats.extended_stats(G, bc=True) computes betweenness using NetworkX module 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')
但我得到的结果与不使用权重完全相同。
the module osmnx.stats.extended_stats(G, bc=True) computes betweenness using NetworkX module networkx.betweenness_centrality(G, normalized=True, weight=None) setting all edge weights as equal. Since the edge length is already embedded in G, it would be straightforward to use it as a weight.
OSMnx automatically uses edge lengths作为计算中介中心性时的权重。对于任何进一步的自定义,您可以直接在您的 OSMnx 图形对象上调用 nx.betweenness_centrality(G)
,并根据需要对其进行参数化。
您检测到 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
。