【发布时间】:2019-07-14 17:59:43
【问题描述】:
我有一个包含 30000 个节点和超过 40000 个边的网络。我尝试使用 networkx 计算我的网络的全局效率,但它的时间效率不高。我想知道为像我这样的大型网络计算全局效率的最佳库是什么?
【问题讨论】:
-
仅供参考 - 我刚刚注意到我上传的内容中有一个错字,这会导致错误的结果。我已经更正了。
我有一个包含 30000 个节点和超过 40000 个边的网络。我尝试使用 networkx 计算我的网络的全局效率,但它的时间效率不高。我想知道为像我这样的大型网络计算全局效率的最佳库是什么?
【问题讨论】:
编辑 9 月 29 日 - 更正了一个错字,我有一个不应该存在的缩进
我查看了 networkx 的实现,发现效率低下(它独立考虑每条可能的路径,而有办法同时找到许多最短路径)。我改进了方法。
试试这个代码:
def my_global_efficiency(G):
'''author Joel C Miller
https://stackoverflow.com/a/57032282/2966723
'''
n = len(G)
denom = n*(n-1)
if denom>0:
efficiency = 0
for path_collection in nx.all_pairs_shortest_path_length(G):
source = path_collection[0]
for target in path_collection[1]:
if target != source:
efficiency += 1./path_collection[1][target]
return efficiency/denom
else:
return 0
使用示例:
import networkx as nx
G = nx.fast_gnp_random_graph(500,0.04)
nx.global_efficiency(G)
#answers will vary based on G
> 0.44650033400070577
my_global_efficiency(G)
> 0.44650033400070543
最后 3 位数字的差异是四舍五入的问题。我认为这是由于某些金额以不同的顺序完成的。
这将运行得更快。但是,对于您的目的而言,这可能还不够改进。
如果您的图表是无向,另一种改进是转到 networkx 代码,将 denom 替换为其值的一半,并将 permutations 更改为 combinations。目前,它查看每对节点并找到两个方向的距离。如果它是无向的,您只需执行一次。因此,更改为 combinations 提供了 2 倍的改进。
根据您的图表,我不清楚哪种更改会更快。对于您的目的,这些可能仍然太慢。
您可以通过获取一个近似值来加快处理速度。为此,不要使用nx.all_pairs_shortest_path_length,而是对大量随机选择的源进行采样,并使用nx.single_source_shortest_path_length 找到G 中每个特定节点与所有其他节点的距离。因此,如果您采用N=100 源,那么将考虑denom=N*(n-1) 路径,其中n 是G 中的节点总数。这应该比改进的my_global_efficiency 提高 300 倍以上的速度。
【讨论】: