这是我的任务:
彼得以1美元的价格去赌场。凭借p的机会,彼得赢得1美元,并且(1-p)他失去1美元的机会。这个过程可以看作马尔可夫链。如果彼得达到0美元,他就会破产,如果他设法达到5美元,他会很高兴回家。
当p = 30%,40%,50%,60%& 70%。构造每个概率的矩阵,其中前4个状态是瞬态类(1-4美元),后两个状态是两个重复状态(0& 5美元)。
我的解决方案
找出每个单独的矩阵收敛(P ^ n = P ^ n + 1)与when_converged。
然后在mpow中使用n来看看从1美元到5美元的概率,换句话说从1到6的状态。
这是我的代码:
mpow <- function(P, n) {
if (n == 0) {
return(diag(nrow(P)))
} else if (n == 1) {
return(P)
} else {
return(P %*% mpow(P, n - 1))
}
}
when_converged <- function(P, tol=0.00005) {
n = 1; diff = 1
while (diff > tol) {
A <- mpow(P, n)
B <- mpow(P, n+1)
diff <- max(abs(A - B))
n <- n + 1
}
return(n)
}
P30 <- matrix(c(0, 0.3, 0, 0, 0.7, 0, 0.7, 0, 0.3, 0, 0, 0, 0, 0.7, 0, 0.3, 0, 0, 0, 0, 0.7, 0, 0, 0.3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)
P40 <- matrix(c(0, 0.4, 0, 0, 0.6, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 0.6, 0, 0, 0.4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)
P50 <- matrix(c(0, 0.5, 0, 0, 0.5, 0, 0.5, 0, 0.5, 0, 0, 0, 0, 0.5, 0, 0.5, 0, 0, 0, 0, 0.5, 0, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)
P60 <- matrix(c(0, 0.6, 0, 0, 0.4, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 0.6, 0, 0, 0.4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)
P70 <- matrix(c(0, 0.7, 0, 0, 0.3, 0, 0.7, 0, 0.3, 0, 0, 0, 0, 0.7, 0, 0.3, 0, 0, 0, 0, 0.7, 0, 0, 0.3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)
when_converged(P30, 0.00005)
从Rstudio我得到P30收敛于35。
when_converged(P40, 0.00005)
从Rstudio我得到的是P40收敛于37。
when_converged(P50, 0.00005)
从Rstudio我得到的是P50收敛于47。
when_converged(P60, 0.00005)
从Rstudio我得到的是P60收敛于61。
when_converged(P70, 0.00005)
从Rstudio我得知P70收敛于79。
mpow(P30, 35)
mpow(P40, 37)
mpow(P50, 47)
mpow(P60, 61)
mpow(P70, 79)
我需要帮助
我从Rstudio得到的是mpow(P60,61)&amp; mpow(P70,79)以5美元回家的概率与mpow相比变得更少(P50,47)&amp; mpow(P40,37)。赢得1美元的概率较小。哪个感觉不对。我有什么不对的吗? 请尝试使用我的方法&amp;没有完整的不同代码。
答案 0 :(得分:3)
这就是我构建P30矩阵的方式......与你的不一样:
> P30 <- matrix(c(1, 0, 0, 0, 0, 0,
+ 0.7, 0, 0.3, 0, 0, 0,
+ 0, 0.7, 0, 0.3, 0, 0,
+ 0, 0, 0.7, 0, 0.3, 0,
+ 0, 0, 0, 0.7, 0 , 0.3,
+ 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)
> P30
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1.0 0.0 0.0 0.0 0.0 0.0
[2,] 0.7 0.0 0.3 0.0 0.0 0.0
[3,] 0.0 0.7 0.0 0.3 0.0 0.0
[4,] 0.0 0.0 0.7 0.0 0.3 0.0
[5,] 0.0 0.0 0.0 0.7 0.0 0.3
[6,] 0.0 0.0 0.0 0.0 0.0 1.0
请注意,在0或5状态的情况下,输入列仅在每一行中发送给自己,但在其他行中,它会被发送到相邻的输出列。因此in-1会转到out-0或out-2。可能更清楚地显示col-和row-names:
> rownames(P30) <- 0:5
> colnames(P30) <- 0:5
> P30
0 1 2 3 4 5
0 1.0 0.0 0.0 0.0 0.0 0.0
1 0.7 0.0 0.3 0.0 0.0 0.0
2 0.0 0.7 0.0 0.3 0.0 0.0
3 0.0 0.0 0.7 0.0 0.3 0.0
4 0.0 0.0 0.0 0.7 0.0 0.3
5 0.0 0.0 0.0 0.0 0.0 1.0
这有助于为P
构建具有不同值的矩阵 p0 <- matrix(0, nrow = 6, ncol = 6); p=.30
p30 <- p0; p30 [cbind(2:5,1:4)] <- 1-p
p30[cbind(2:5,3:6)] <- p
p30[ cbind(c(1,1),c(6,6))] <- 1
p30
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1.0 0.0 0.0 0.0 0.0 0.0
[2,] 0.7 0.0 0.3 0.0 0.0 0.0
[3,] 0.0 0.7 0.0 0.3 0.0 0.0
[4,] 0.0 0.0 0.7 0.0 0.3 0.0
[5,] 0.0 0.0 0.0 0.7 0.0 0.3
[6,] 0.0 0.0 0.0 0.0 0.0 1.0
三次迭代后的确定性或理论概率(从state = 1开始:
c(0,1,0,0,0,0) %*% P30 %*% P30 %*% P30
#-----
0 1 2 3 4 5
[1,] 0.847 0 0.126 0 0.027 0
同意您的mpow
> c(0,1,0,0,0,0) %*% mpow(P30 ,3)
0 1 2 3 4 5
[1,] 0.847 0 0.126 0 0.027 0
%^%
- 包中还有一个矩阵幂函数expm
。
> c(0,1,0,0,0,0) %*% expm::'%^%'( P30,3)
0 1 2 3 4 5
[1,] 0.847 0 0.126 0 0.027 0