首页 > 解决方案 > 随机生成具有指定聚类系数的网络

问题描述

过去,我曾经用igraph指定的重新布线概率生成小世界网络p,这特别容易,因为它是函数中的一个参数sample_smallworld。例如:

myNetwork <- sample_smallworld(dim = 1, size = 10, nei = 2, p = 0.25)
plot(myNetwork, layout = layout_in_circle)

我现在想生成具有指定聚类系数的小世界网络。我是新手igraph,这似乎是一个功能,但经过一番搜索,我只找到了从预先存在的网络计算系数的方法,而不是一种将其用作生成网络的参数的方法本身。

生成具有指定聚类系数的网络的最佳方法是什么?

标签: rigraph

解决方案


如果您对一些条件没问题,那么可以使用sna::rguman(). 条件是:(1)使用全局传递性(也许你可以使用它并修改);(2) 使用无向图;(3) 如果使用较小的传递性值,则使用大尺寸图,或者对小尺寸图使用较大的传递性值。另外,放弃sample_smallworld()算法。如果没问题,这可能会让您到达您想去的地方:

library(sna)
library(igraph)

sample_cluster <- function(nv = 150, clustering_coef = 0.5, thres = 0.05) {
  g <- sna::rguman(1, nv, mut = clustering_coef, asym = 0, null = 1 - clustering_coef) %>% 
    graph_from_adjacency_matrix(mode = "undirected")

  while (!(transitivity(g) >= clustering_coef-thres & transitivity(g) <= clustering_coef+thres)) {
    g <- sna::rguman(1, nv, mut = clustering_coef, asym = 0, null = 1 - clustering_coef) %>% 
      graph_from_adjacency_matrix(mode = "undirected")
  }

  return(g)

} 


sample_cluster(15, clustering_coef = 0.2, thres = 0.001) %>% transitivity()
#> [1] 0.2

sample_cluster(200, clustering_coef = 0.01, thres = 0.001) %>% transitivity()
#> [1] 0.009009009

sample_cluster(200, clustering_coef = 0.2, thres = 0.001) %>% transitivity()
#> [1] 0.2007628

sample_cluster(20, clustering_coef = 0.7, thres = 0.001) %>% transitivity()
#> [1] 0.7007168

reprex 包(v0.3.0)于 2020 年 3 月 31 日创建

不花哨,不复杂,但可能会成功!


推荐阅读