簡體   English   中英

使用R igraph計算300萬個節點圖的每個頂點的最短路徑的平均值

[英]Calculating average of shortest paths for each vertex for a 3 million node graph using R igraph

我有一個具有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萬個頂點的每個頂點的平均最短路徑時,我需要幫助。

調用average.path.length(G)可能更快。 此處的文檔: http : //cneurocvs.rmki.kfki.hu/igraph/doc/R/shortest.paths.html

編輯:對不起,那混亂。 我認為您可以在此處使用兩種一般策略:

  1. 與此平行。
  2. 根據節點采樣而不是整個圖來計算最短路徑,並根據這些路徑的平均值來估計平均最短路徑。

我只是在筆記本電腦上進行了一些實驗,發現並行化帶來了性能上的顯着改善,子采樣帶來了較小的改善(70%,其次是額外的10%,在使用5000個節點的barabasi圖上總共改善了約72%)我的筆記本電腦)。 此外,平均抽樣誤差百分比迅速下降,並且在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM