【问题标题】:How can I calculate the average path length of the graph efficiently in graph-tool?如何在图形工具中有效地计算图形的平均路径长度?
【发布时间】:2016-09-09 08:35:39
【问题描述】:

我正在处理大约 10000 个顶点的网络,我正在使用 graph-tool 来分析它们。我要为这些图表中的每一个计算的一件事是平均路径长度,它被定义为图表中所有节点对的最短距离的平均值。所以我尝试了这个:

ave_path_length = 0
tot = 0

for v1 in G.vertices():
    print(v1)
    for v2 in G.vertices():
        if v1 != v2 :
            tot += 1
            ave_path_length += gt.shortest_distance(G, v1, v2)

ave_path_length /= tot

但是,这需要永恒。有没有更好的方法来完成任务?提前致谢。

【问题讨论】:

    标签: python-3.x graph graph-tool


    【解决方案1】:

    你可以吗,

    all_sp = gt.shortest_distance(G)
    vertex_avgs = graph_tool.stats.vertex_average(G, all_sp)
    avg_path = numpy.mean(vertex_avgs[0])
    

    我还没有尝试过,但这应该可以。

    【讨论】:

      【解决方案2】:

      我找到了一种非常有效的方法来实现这一点。可以这样做:

      import graph_tool.all as gt
      dist = gt.shortest_distance(G)
      ave_path_length = sum([sum(i) for i in dist])/(G.num_vertices()**2-G.num_vertices())
      

      对于大小为 10000 的稀疏网络,这只需几秒钟。但是,我仍然很好奇是否存在更好的方法。

      【讨论】:

        【解决方案3】:

        您可以使用distance(v1,v2) == distance(v2,v1) 的事实将时间缩短2。所以只计算一半的值(也除以一半,但这是自动处理的)

        vert = G.vertices()  # not sure it is a list. If not just convert to a list first
        for i,v1 in enumerate(vert):
            for j in range(i+1,len(vert)):
                tot += 1
                ave_path_length += gt.shortest_distance(G, v1, vert[j])
        
        ave_path_length /= tot
        

        除此之外,你可以避免计算tot

        tot = (len(vert)-1)*(len(vert)-2)//2
        

        【讨论】:

        • 没错。我已经实现了这一点,但只是没有展示它以避免复杂化。这使时间减少了原来的一半,但并没有大幅减少。
        • 查看我的最后一次编辑。恐怕你无能为力,除了优化shortest_distance:即:不要使用库(除非它已经是原生的!),自己做“内联”:避免参数传递和函数调用。您可以尝试编辑显示此功能内部的帖子吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        • 2021-03-16
        • 2020-05-05
        • 1970-01-01
        相关资源
        最近更新 更多