gpt4 book ai didi

大图中的随机 session : efficient way of adding or deleting edges of a graph in R

转载 作者:行者123 更新时间:2023-12-03 22:58:52 26 4
gpt4 key购买 nike

我正在尝试找到一种使用 igraph 在 R 中的图形中模拟随机 session 的有效方法。
我设法使用下面的代码来做到这一点,其中我假设边以某种概率(prob.meet)出现并将它们添加到相同大小的(预先存在的)空图中。
然而,对于大图,这不是有效的。另外,我一遍遍地重复这个过程。

  • 第一层低效率是边的随机选择
    使用 rbin()函数(占 25% 的时间)
  • 低效率的第二层是在现有的空域中添加边
    使用 add_edges() 的图形函数(占 75% 的时间)

  • 关于如何提高效率的任何建议?
    这是我尝试过的:
  • 首先,我创建一个随机图:
  • library(igraph)

    nodes = 5
    g1 <- barabasi.game(nodes)
    EL1 <- get.edgelist(g1, names=FALSE)
  • 其次,我假设边以概率“prob.meet”弹出,并将它们添加到一个空图中。我这样做的原因是强制g_meet尺寸符合 g1 .
  • prob.meet = 0.5

    EL_meet <- matrix(EL1[(as.logical(rbinom(nrow(EL1), 1, prob.meet))),],
    nrow=2,byrow = TRUE
    )

    g_meet <- make_empty_graph(n = nodes) %>%
    add_edges(EL_meet)

    最佳答案

    据我所知,只有边际的速度提升。
    It has been reported使用 runif()比使用 rbinom() 快在您的特定用例中。在我的系统上运行它似乎证实了这一点:

    prob.meet <- 0.5
    system.time({rbinom(1000000, 1, prob.meet)})
    # user system elapsed
    # 0.10 0.00 0.11
    system.time({runif(1000000) < prob.meet})
    # user system elapsed
    # 0.05 0.00 0.04
    但是,正如您所看到的,在进行一百万次随机抽奖时,我们只讨论了百分之几秒的改进。
    将边添加到新的空图中的另一种方法是删除非 session 边。这看起来像这样:
    library(igraph)

    delete_non_meeting_edges <- function(g, prob.meet = 0.5) {
    g <- set_edge_attr(g, "meet", E(g), runif(gsize(g)) < prob.meet)
    delete_edges(g, E(g)[!meet])
    }

    ## Usage
    g <- barabasi.game(1000000)
    delete_non_meeting_edges(g)
    然而,上面的并不是真的更快。 This answer表明由于底层数据结构,igraph 对象的突变本质上是缓慢的。在链接的答案中,建议将矢量化作为一种​​加速突变的方法,但是您作为上面代码提供的两个示例都已经使用了它。
    所以我担心,如果你使用 igraph,速度不会有太大的提升。

    关于大图中的随机 session : efficient way of adding or deleting edges of a graph in R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67806531/

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