gpt4 book ai didi

r - R : efficiently count number of edges between multiple sets of vertices 中的 igraph

转载 作者:行者123 更新时间:2023-12-05 04:26:40 25 4
gpt4 key购买 nike

我想计算给定图的边数矩阵,并将该图分成几组。我目前的解决方案不适用于大图,我想知道是否可以加快计算速度。

我想为此使用 igraph R 包,所以对于图 G 和两组顶点 set1set2 我目前使用 igraph 的 %->% 运算符计算从一组到另一组的边数。

el <- E(G)[set1 %->% set2]
length(el)

我想知道是否有更快的方法可以在 igraph 中本地或通过自制一些解决方案(可能使用 Rcpp)来执行此操作?

示例代码

library(igraph)

# Set up toy graph and partition into two blocks
G <- make_full_graph(20, directed=TRUE)
m <- c(rep(1,10), rep(2,10))

block_edge_counts <- function(G, m){
# Get list of vertices per group.
c <- make_clusters(G, m, modularity = FALSE)
# Calculate matrix of edge counts between blocks.
E <- sapply(seq_along(c), function(r){
sapply(seq_along(c), function(s){
# Iterate over all block pairs
el <- E(G)[c[[r]] %->% c[[s]]] # list of edges from block r to block s
length(el) # get number of edges
})
})
}

block_edge_counts(G, m)
#> [,1] [,2]
#> [1,] 90 100
#> [2,] 100 90

示例基准

#> install.packages("bench")

results <- bench::press(
Nsize = c(10,100,1000),
{
G <- make_full_graph(Nsize, directed=TRUE)
m <- c(rep(1,.5*Nsize), rep(2,.5*Nsize))
bench::mark(block_edge_counts(G,m))
}
)
#> Running with:
#> Nsize
#> 1 10
#> 2 100
#> 3 1000
#> Warning: Some expressions had a GC in every iteration; so filtering is disabled.
results
#> # A tibble: 3 × 7
#> expression Nsize min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <dbl> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 block_edge_counts(G, m) 10 1.24ms 1.31ms 752. 39.97KB 12.6
#> 2 block_edge_counts(G, m) 100 3.24ms 3.37ms 284. 4.11MB 32.1
#> 3 block_edge_counts(G, m) 1000 262.73ms 323.61ms 3.29 408.35MB 34.2

解决方案

现在我要去

block_edge_counts <- function(graph, partition) {
CG <- contract(graph, partition)
E <- as_adjacency_matrix(CG, sparse=FALSE)
}

最佳答案

一种方法是将两个集合收缩成单个顶点,然后计算它们之间的边。

收缩两个集合,第一个获取顶点id 1,第二个获取顶点id 2:

CG <- contract(G, m)

现在计算 1 -> 22 -> 1 条边:

> count_multiple(CG, get.edge.ids(CG, c(1,2, 2,1)))
[1] 100 100

如果您对图进行了完整分区,则可以使用以下方法计算分区内边的分数

modularity(G, m, resolution = 0)

您的示例已完全划分为两组,因此您可以获得这两组之间的边数作为

> ecount(G)*(1 - modularity(G, m, resolution = 0))
[1] 200

关于r - R : efficiently count number of edges between multiple sets of vertices 中的 igraph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72992544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com