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
型
但是,正如我们预期的那样,它对于大型网络来说要慢得多。任何形式的修改都是值得的。
1条答案
按热度按时间kt06eoxx1#
我无法使用getAnywhere找到该函数的源代码,因为对该函数的一个小修改将给我给予2-星星计数,我推测。
在这里,但我真的不认为这是你想要的...
https://github.com/igraph/igraph/blob/b4a65cfb83f110e0102bdeef70cca42da99f3010/src/properties/triangles.c#L426
有没有什么快速算法可以从图形中找到2-星星或楔形计数?
您可以使用igraph的主题计数器。示例:
字符串
有39个双星和12个三角形。请注意,这些被计为induced subgraphs。
您建议使用
sum(A^2)
作为两星计数,其中A
是邻接矩阵。这有几个问题:Tr(A^2)
是边缘计数的两倍,你可以减去它。sum(A^2)/2 - E
,其中E
是边缘计数。诱导双星数的正确公式是
型
三角形个数的计算公式为
型
只要你在处理稀疏矩阵,这对大型图来说是一个相当有效的方法。
还有一个小提示:要验证计数,您可以将
count_subgraph_isomorphisms
与induced=TRUE
或induced=FALSE
一起使用。默认值为FALSE
。此方法也会以count_automorphisms(pattern)
的因子进行计数。这不会非常有效,但它可以在您开发其他计数方法时给予信心。