【问题标题】:Calculating average of shortest paths for each vertex for a 3 million node graph using R igraph使用 R igraph 计算 300 万个节点图的每个顶点的最短路径平均值
【发布时间】:2017-11-20 07:56:48
【问题描述】:

我有一个包含 300 万个顶点的未加权图。我想找到每个顶点的最短路径的平均值。

我已经尝试使用 igraph 生成 3000 个节点的示例图,代码如下:

 N <- gorder(G)
 spathAvg <- lapply(V(G),
             function(v){
              q <-   shortest.paths(G, v )
              rowSums(q*is.finite(q),na.rm = TRUE)/N

            })

而且效果很好。 但是,计算 300 万个顶点中的 1000 个的平均最短路径大约需要 10 分钟。计算所有 300 万个顶点将花费大量时间。 我需要帮助以快速有效的方式计算 300 万个顶点的每个顶点的平均最短路径。

【问题讨论】:

    标签: r graph igraph


    【解决方案1】:

    拨打average.path.length(G) 可能会更快。文档在这里:http://cneurocvs.rmki.kfki.hu/igraph/doc/R/shortest.paths.html

    编辑:对这种混乱感到抱歉。我认为您可以在这里使用两种通用策略:

    1. 将此并行化。
    2. 根据节点样本而不是整个图计算最短路径,并根据这些路径的平均值估计平均最短路径。

    我只是在我的笔记本电脑上对此进行了一些实验,发现并行化的性能显着提高,二次采样的改进较小(70%,然后是额外的 10%,在 5000 个节点上总共提高了 72% 左右) barabasi 图表使用我的笔记本电脑)。此外,平均 % 采样误差下降很快,在 5% 和 10% 采样之间没有太大变化(这可能是我为这个实验选择了 barabasi 图的结果)。如果您有权访问 HPC 集群,则这些策略中的一个或两个应该非常适合映射到单独的工作人员。

    您的代码修改为使用并行化和下采样:

    library(igraph)
    library(foreach)
    library(doParallel)
    
    stopCluster(cl)
    cl <- makeCluster(8)
    registerDoParallel(cl)
    
    sampled_est_par <- function(G, perc_subsample=.1, max_samples=1e3){
      N <- gorder(G)
      m <- floor(perc_subsample*N)
      m <- ifelse(m>max_samples, max_samples, m)
      foreach(v=1:N) %dopar% {
        q <-   igraph::shortest.paths(G, v, sample(N, m))
        rowSums(q*is.finite(q),na.rm = TRUE)/m
      }
    }
    

    这是我的实验代码:https://gist.github.com/dmarx/80b4d093bdcab2fff97ee0da2968084f

    【讨论】:

    • average.path.length(G) 提供整个图的平均路径长度;不是每个顶点。我需要每个顶点的平均路径长度。
    猜你喜欢
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多