这是我的任务:
彼得带着一美元去赌场。有了p的机会,彼得赢了1美元,他赢了1美元。这个过程可以看作是一个马尔可夫链。
如果彼得到了0美元,他就破产了,如果他能赚到5美元,他就幸福地回家了。
当p=为30%、40%、50%、60%和70%时,找出彼得带着5美元回家的可能性。构造每个概率的矩阵,其中前4个状态是瞬态类(1-4美元),最后两个状态是两个递归状态(0&5美元)。
我解决它的计划
当每个独立的矩阵与when_converged收敛时(P^n=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)和mpow(P70,79)来说,用5美元回家的概率比mpow(P50,47)和mpow(P40,37)要小。其中赢1美元的可能性较小。感觉不对。我做错什么了吗?请尝试使用我的方法来解决这个问题&而不是使用完全不同的代码。
发布于 2016-07-12 00:21:45
这就是我如何构造一个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状态下被发送给自己,而在其他情况下,它被发送到相邻的输出列。所以,在-1中要么是0,要么是2。用头名和行名显示可能更清楚:
> 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-package中也有一个矩阵幂函数-package.
> 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 0https://stackoverflow.com/questions/38312464
复制相似问题