[英]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
)的分步實現。
我們首先加載庫。
library(markovchain);
我們定義了轉移矩陣和狀態(這里對於圖節點僅是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);
我們定義一個馬爾可夫鏈對象。
mc <- new( "markovchain", states = states, byrow = TRUE, transitionMatrix = mat, name = "random_walk");
現在,我們模擬由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.