【问题标题】:Generate Random network models with specified number of edges in r在 r 中生成具有指定边数的随机网络模型
【发布时间】:2016-05-17 17:33:38
【问题描述】:

我想生成随机网络,并将该网络与我的原始网络进行比较,该网络有 16809 个节点和 173393 个边。因此,为了将其与不同的网络模型进行比较,我将不得不生成具有相同边数的网络模型。在 erdos.renyi 模型中,我可以生成具有指定边数的随机图。如何使用 r 中的 igraph 库生成具有相同边数的无标度和小世界网络。

我的示例脚本如下。

library(igraph)
g_erdos_renyi <- erdos.renyi.game(16809, 173393 , type = "gnm" , directed = F , loops = F)
g_scale <- barabasi.game(16809 , m = 10)
g_small <- watts.strogatz.game(1, 16809, 10, 0.05)

如何生成边数为 173393 的随机网络 g_scale 和 g_small..??

【问题讨论】:

    标签: r igraph


    【解决方案1】:

    简短的回答是它有点繁琐,您需要决定使用什么策略来向上或向下舍入边数。

    小世界

    对于小世界,因为它是一个高度有序的结构,所以很难准确指定您想要多少条边,因为每个节点以相同的度数开始并且您随机重新布线。我能想到的最好的办法是制作下一个最大的网络并随机删除边缘:

    n <- 16809
    m <- 173393
    
    # Work out how theye divide into each other
    rem <- m %% n
    div <- m %/% n
    
    set.seed(123)
    if(rem != 0) {
      g <- sample_smallworld(1, n, div+1, p = 0.001)
    # Randomly delete the unwanted edges. Should be quite homegenous
      g <- delete_edges(g, sample(1:gsize(g), size = gsize(g) - m))
    } else {
      g <- sample_smallworld(1, n, div, p = 0.001)
    }
    

    优先附件

    同样,对于 BA 网络,它需要有序数量的边进入。您可以使用 out.seq 参数指定每一步添加的边数:

    # Barabasi - Albert --------------------------------------------------------
    
    genOutSeq <- function(n, m) {
      n <- n-1 # Shift it along
      rem <- m %% n
      c(0, rep(m%/%n + 1, rem), rep(m%/%n, n - rem))
    }
    
    n <- 16809
    m <- 173393
    
    # This creates the right number of edges but some are multiple
    set.seed(11)
    g <- sample_pa(n, power = 0.5, out.seq = genOutSeq(n, m),
                   algorithm = "psumtree-multiple", directed = FALSE)
    gsize(g)
    
    set.seed(11)
    g <- sample_pa(n, power = 0.5, out.seq = genOutSeq(n, m),
                   algorithm = "psumtree", directed = FALSE)
    
    # Randomly add the remainder
    
    nMulti <- m - gsize(g) # Number of multiple edges that were removed
    
    for (i in 1:nMulti) {
      vPair <- sample(1:n, size = 2)
      while (get.edge.ids(g, vPair) > 0) {
        add_edges(g, vPair)
        vPair <- sample(1:n, size = 2)
      }
    }
    
    g
    

    如您所见,第一次运行使用了一种生成多重边的算法。我通过随机添加它们来解决这个问题,但这取决于你使用什么策略。

    【讨论】:

    • 我为BA模型设置:set.seed(41); n
    猜你喜欢
    • 2017-10-17
    • 2011-12-24
    • 1970-01-01
    • 2014-03-14
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多