【问题标题】:Random walks on directed graph in RR中的有向图上的随机游走
【发布时间】:2018-06-02 15:01:01
【问题描述】:

我是 R 编程新手。我有一个有向图,它有 6 个节点,还提供了一个 6 行和 6 列的概率矩阵。如果随机游走者在图上行走 100,000 步,则输出向量应如下所示: 0.1854753、0.1301621、0.0556688、0.1134808、0.15344649、0.3617481 对应于本次随机游走实验中访问 6 个节点的概率(计数除以总步数,在本例中为 100,000)。

我需要为此任务创建一个函数并演示如何使用它。该函数将图形和步数作为输入。

提供的矩阵如下:

     [,1] [,2] [,3] [,4] [,5] [,6]

[1,]  0.0  0.5  0.3  0.0  0.0  0.2

[2,]  0.1  0.2  0.0  0.4  0.1  0.2

[3,]  0.5  0.0  0.0  0.0  0.0  0.5

[4,]  0.0  0.1  0.0  0.0  0.6  0.3

[5,]  0.0  0.0  0.0  0.4  0.0  0.6

[6,]  0.4  0.0  0.0  0.0  0.2  0.4

谁能帮我解决这个问题?

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用马尔可夫链的分步实现(通过 R 库 markovchain)。

    1. 我们首先加载库。

      library(markovchain);
      
    2. 我们定义了转移矩阵和状态(这里只是 1...6 用于图节点)

      mat <- matrix(c(
          0.0,  0.5,  0.3,  0.0,  0.0,  0.2,
          0.1,  0.2,  0.0,  0.4,  0.1,  0.2,
          0.5,  0.0,  0.0,  0.0,  0.0,  0.5,
          0.0,  0.1,  0.0,  0.0,  0.6,  0.3,
          0.0,  0.0,  0.0,  0.4,  0.0,  0.6,
          0.4,  0.0,  0.0,  0.0,  0.2,  0.4), ncol = 6, byrow = T)
      states <- as.character(1:6);
      
    3. 我们定义一个马尔可夫链对象。

      mc <- new(
          "markovchain",
          states = states,
          byrow = TRUE,
          transitionMatrix = mat,
          name = "random_walk");
      
    4. 我们现在模拟一个由nSteps(这里是1e6)组成的随机游走,并用prop.table(table(...))获得每个状态(节点)的渐近概率

      nSteps <- 1e6;
      random_walk <- markovchainSequence(nSteps, mc, t0 = "1");
      prop.table(table(random_walk));
      #random_walk
      #       1        2        3        4        5        6
      #0.185452 0.129310 0.055692 0.113410 0.153787 0.362349
      

      请注意,如果您重新运行代码,渐近概率可能会略有变化。

    将它封装在一个函数中是直截了当的,我将把它留给你。

    【讨论】:

      【解决方案2】:

      假设您为有向图提供概率矩阵 (prob_mat),并且没有步骤 (no_of_steps) 作为输入。应该这样做:

      set.seed(150)
      
      find_pos_prob <- function(prob_mat, no_of_steps){
      
                       x <- c(1:nrow(prob_mat))               # index for nodes
                       position <- 1                          # initiating from 1st Node
                       occured <- rep(0,nrow(prob_mat))       # initiating occured count
      
                       for (i in 1:no_of_steps)   {
                       # update position at each step and increment occurence
                       position  <-  sample(x, 1, prob = prob_mat[position,])      
                       occured[position] <- occured[position] + 1
                                                  }
                       return (occured/no_of_steps)
                           }
      
      find_pos_prob(prob_mat, 100000) 
      
      #[1] 0.18506 0.13034 0.05570 0.11488 0.15510 0.35892
      

      数据:

      prob_mat <- matrix( c(0.0,  0.5,  0.3,  0.0,  0.0,  0.2,
                            0.1,  0.2,  0.0,  0.4,  0.1,  0.2,
                            0.5,  0.0,  0.0,  0.0,  0.0,  0.5,
                            0.0,  0.1,  0.0,  0.0,  0.6,  0.3,
                            0.0,  0.0,  0.0,  0.4,  0.0,  0.6,
                            0.4,  0.0,  0.0,  0.0,  0.2,  0.4), byrow = TRUE, ncol = 6) 
      

      注意:模拟结果与解析解不同。理想情况下,您应该移除种子,运行该函数 15-20 次并取运行中概率的平均值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-03
        • 2021-05-05
        • 1970-01-01
        • 2021-02-09
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        相关资源
        最近更新 更多