在大型网络中计算全局效率的省时方法是什么?

时间:2019-07-14 17:59:43

标签: python graph networkx

我有一个拥有30000个节点和超过40000个边缘的网络。我试图使用networkx计算网络的整体效率,但是效率不高。我想知道对于像我这样的大型网络,计算全球效率的最佳库是什么?

1 个答案:

答案 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倍。