代码之家  ›  专栏  ›  技术社区  ›  J. Doe

比igraph::random\u walk()更有效地在转移矩阵上运行随机游动

  •  3
  • J. Doe  · 技术社区  · 7 年前

    我试图在一个特定的转移矩阵(20000*20000)上创建一个随机游走器,到目前为止,我正在使用 igraph::random_walk() R包中的函数 igraph .

    该函数的作用是获取一个图形作为输入,而不是转换矩阵。这意味着您首先必须使用以下命令将转换矩阵转换为图形:

    # Transform transition matrix into graph
    g <- igraph::graph.adjacency( as.matrix(tm), mode = "directed", weighted = TRUE )
    

    因为我的转移矩阵是一个20000*20000的矩阵 tm 占3.1GB左右,对应图 g 占用13.3GB。这种方法的缺点是脚本会填满整个内存(32GB RAM系统),有时内核(可能)会终止进程。

    所以我想知道在R中是否有其他包(找不到任何东西)可以返回转移矩阵上的随机游动,而不需要先转换为图。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Julius Vainora    7 年前

    手动实现怎么样?

    library(igraph)
    set.seed(1)
    resample <- function(x, ...) x[sample.int(length(x), ...)]
    n <- 1000
    tm <- matrix(sample(0:1, n^2, prob = c(0.95, 0.05), replace = TRUE), n, n)
    tm <- (tm == 1 | t(tm) == 1) * 1
    diag(tm) <- 0
    
    start <- 23 # Random walk starting vertex
    len <- 10 # Walk length
    path <- c(start, rep(NA, len))
    for(i in 2:(len + 1)) {
      idx <- tm[path[i - 1], ] != 0
      if(any(idx)) {
        path[i] <- resample(which(idx), 1, prob = tm[path[i - 1], idx])
      } else {
        break # Stopping if we get stuck
      }
    }
    path
    #  [1]   23 3434 4908 4600  332 4266 1752 1845 4847 4817 1992