【问题标题】:What is the time efficient way to calculate Global efficiency for large networks?计算大型网络的全局效率的时间有效方法是什么?
【发布时间】:2019-07-14 17:59:43
【问题描述】:

我有一个包含 30000 个节点和超过 40000 个边的网络。我尝试使用 networkx 计算我的网络的全局效率,但它的时间效率不高。我想知道为像我这样的大型网络计算全局效率的最佳库是什么?

【问题讨论】:

  • 仅供参考 - 我刚刚注意到我上传的内容中有一个错字,这会导致错误的结果。我已经更正了。

标签: python graph networkx


【解决方案1】:

编辑 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) 路径,其中nG 中的节点总数。这应该比改进的my_global_efficiency 提高 300 倍以上的速度。

【讨论】:

    猜你喜欢
    • 2020-01-21
    • 2011-01-26
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多