我正在尝试使用igraph
计算非常大的brainGraph::efficiency(my_graph, type = "global")
的全局效率。
library(igraph); library(brainGraph)
g <- readRDS("path_to_my_graph.rds")
> ecount(g); vcount(g) # count of edges and vertices
[1] 715758
[1] 290190
它每次都会可靠地使R崩溃。全局效率是所有节点效率的平均值,因此我尝试以这种方式进行计算没有成功。图上每个边的权重均为1,因此省略了权重,但R仍然崩溃。
# all of these cause R to crash
efficiency(g, type = "global")
efficiency(g, type = "nodal")
efficiency(g, type = "global", weights = NA)
efficiency(g, type = "nodal", weights = NA)
我的图表(〜37MB)对于需要数据测试的人可用here on GoogleDrive as an .rds file。
答案 0 :(得分:0)
R崩溃是因为brainGraph::efficiency()
试图计算一个巨大且密集的距离矩阵,这淹没了我的计算机的内存(32 GB)。但是我找到了一种解决方案,可以分块操作并并行运行。
全局效率是图中所有节点效率的平均值。顶点 i 的节点效率为:
我们可以按顺序计算图中每个顶点的节点效率,从而将距离矩阵计算分为较小的可管理位。因为每个顶点的效率是独立的,所以我们可以并行化操作,这样就不会花很长时间。
library(igraph)
library(doParallel)
# nodal efficiency function
get_eff <- function(i){return((1/(length(V(g)) - 1))*sum(1/distances(g, V(g)[i])[-i]))}
no_cores <- detectCores() - 1
cl <- makeCluster(no_cores)
registerDoParallel(cl)
result <- foreach(i = seq_along(V(g)), .combine = c, .packages = "igraph") %dopar% get_eff(i)
stopCluster(cl)
rm(cl)
global_eff <- mean(result)
此外,我们可以绘制节点效率的分布以及全局(平均)效率,这使我们对网络有了更好的了解。
library(ggplot2)
data.frame(x = result) %>%
ggplot(aes(x)) +
geom_histogram() +
geom_vline(xintercept = mean(result), col = "red") # global efficiency
theme_minimal() +
labs(title = "Nodal efficiences", x = "", y = "Count")