如何使用R中的igraph包计算图或网络中的2-星星或楔形的数量

lawou6xi  于 2024-01-03  发布在  其他
关注(0)|答案(1)|浏览(99)

igraph包提供了非常有效的计算图或网络中三角形的数量,即count_triangles()函数。
我无法找到使用getAnywhere的该函数的源代码,因为对该函数的一个小修改将给我给予2-星星计数,我推测。
有没有什么快速算法可以从图形中找到2-星星或楔形计数?
假设我们想从下图中找出楔形的个数

w3 <- matrix(c(c(0,1,1,1), c(1,0,1,0), c(1,1,0,0), c(1,0,0,0)), nrow = 4, ncol = 4)
w21 <- graph_from_adjacency_matrix(w3, mode = "undirected")

字符串
对于像w3这样的小图,三角形计数的结果如下所示

triangle_cnt <- function(adj_mat){
  return(sum(diag(adj_mat %*% adj_mat %*% adj_mat)))
}# triangle count function

triangle_cnt.igraph <- function(adj_mat){
  adg_mat <- graph_from_adjacency_matrix(adj_mat)
  return(sum(count_triangles(adg_mat)) * 2)
}# triangle count function
microbenchmark::microbenchmark(triangle_cnt(w3), triangle_cnt.igraph(w3))


输出

> microbenchmark::microbenchmark(triangle_cnt(w3), triangle_cnt.igraph(w3))
Unit: microseconds
                    expr    min     lq     mean median      uq     max neval
        triangle_cnt(w3)  1.435  1.640  2.06394   2.05  2.1730  14.104   100
 triangle_cnt.igraph(w3) 57.400 58.999 63.25521  59.86 62.3815 254.692   100


但是对于具有1000多个节点的大型图,以下性能变化剧烈

> microbenchmark::microbenchmark(triangle_cnt(adj_mat), triangle_cnt.igraph(adj_mat))
Unit: milliseconds
                         expr      min       lq     mean   median       uq      max neval
        triangle_cnt(adj_mat) 651.1529 660.7670 669.5889 663.1095 665.9754 753.3584   100
 triangle_cnt.igraph(adj_mat) 180.1882 181.3038 195.4430 181.9534 182.6366 524.7692   100


其中adj_mat是具有1000个节点的图的邻接矩阵。您可以使用任何模型生成。
类似地,我有以下代码用于网络中的楔形计数。

wedge_cnt <- function(adj_mat){
  return(sum(adj_mat %*% adj_mat))
}#Wedge count function


但是,正如我们预期的那样,它对于大型网络来说要慢得多。任何形式的修改都是值得的。

kt06eoxx

kt06eoxx1#

我无法使用getAnywhere找到该函数的源代码,因为对该函数的一个小修改将给我给予2-星星计数,我推测。
在这里,但我真的不认为这是你想要的...
https://github.com/igraph/igraph/blob/b4a65cfb83f110e0102bdeef70cca42da99f3010/src/properties/triangles.c#L426
有没有什么快速算法可以从图形中找到2-星星或楔形计数?
您可以使用igraph的主题计数器。示例:

> set.seed(123)
> g<-sample_gnm(10,20)
> motifs(g,3)
[1] NA NA 39 12

字符串
有39个双星和12个三角形。请注意,这些被计为induced subgraphs
您建议使用sum(A^2)作为两星计数,其中A是邻接矩阵。这有几个问题:

  • 对角线应该被排除。因为Tr(A^2)是边缘计数的两倍,你可以减去它。
  • 这种方法是每两颗星计数两次,所以我们需要校正sum(A^2)/2 - E,其中E是边缘计数。
  • 这个方法是计算所有的子图,而不仅仅是导出的子图。它会在每个三角形中计算3个双星。所以我们必须减去三角形的数量。

诱导双星数的正确公式是

sum(A^2) / 2 - Tr(A^3) / 2 - E


三角形个数的计算公式为

Tr(A^3) / 6


只要你在处理稀疏矩阵,这对大型图来说是一个相当有效的方法。
还有一个小提示:要验证计数,您可以将count_subgraph_isomorphismsinduced=TRUEinduced=FALSE一起使用。默认值为FALSE。此方法也会以count_automorphisms(pattern)的因子进行计数。这不会非常有效,但它可以在您开发其他计数方法时给予信心。

相关问题