比igraph :: random_walk()更有效的方式在转移矩阵上运行随机游走

时间:2018-03-04 12:43:59

标签: r matrix igraph random-walk

我正在尝试在特定转换矩阵(20,000 * 20,000)上创建随机漫步者,到目前为止,我正在使用R的包igraph::random_walk()中的igraph函数。

具有该功能的东西是获取图形而不是转换矩阵。这意味着您首先必须使用以下命令将转换矩阵转换为图形:

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

由于我的转换矩阵是20,000 * 20,000矩阵,变量tm占用约3.1GB,相应的图g占用13.3GB。这种方法的缺点是脚本占用整个内存(32GB RAM系统),有时内核(可能)会导致进程终止。

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

1 个答案:

答案 0 :(得分:1)

如何手动实施?

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