我有一个拥有30000个节点和超过40000个边缘的网络。我试图使用networkx计算网络的整体效率,但是效率不高。我想知道对于像我这样的大型网络,计算全球效率的最佳库是什么?
答案 0 :(得分:1)
我查看了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
更改为{{1 }}。当前,它查看每对节点并找到两个方向上的距离。如果是无向的,则只需执行一次。因此,对combinations
的更改带来了2倍的改善。
根据您的图表,我不清楚哪个更改会更快。而且这些可能仍然太慢,无法满足您的目的。
您可以通过获取一个近似值来进一步加快该过程。为此,请使用combinations
对大量随机选择的源进行采样,而不是使用nx.all_pairs_shortest_path_length
,并找到这些特定节点中的每个节点与G
中所有其他节点的距离。因此,如果采用nx.single_source_shortest_path_length
源,那么将考虑N=100
条路径,其中denom=N*(n-1)
是n
中节点的总数。与改进后的G
相比,这应该提高300倍。