簡體   English   中英

隨機在R中的有向圖上行走

[英]Random walks on directed graph in R

我是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

有人可以幫我解決問題嗎?

假設您給出了有向圖的概率矩陣( 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次,並在運行中取平均概率

這是使用馬爾可夫鏈(通過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 

    請注意,如果您重新運行代碼,則漸近概率可能會略有變化。

將其包裝在一個函數中很簡單,我將由您自己決定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM