随机走在R中的有向图上

时间:2018-06-01 03:53:48

标签: r

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

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

提供的矩阵如下:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\. [NC,OR]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L,NE] 

RewriteRule ^index.php / [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteRule ^(.*)$ $1.php
ErrorDocument 404 /404.php

有人可以帮我解决问题吗?

2 个答案:

答案 0 :(得分:0)

假设您为有向图提供概率矩阵(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次函数并获取运行中概率的平均值

答案 1 :(得分:0)

以下是使用马尔可夫链(通过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
    

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

  5. 将它包装在一个单一的功能中是直截了当的,我会把它留给你。