在计算 P^n 时,matrixpower() 和 markov() 有什么区别?
What is the difference between matrixpower() and markov() when it comes to computing P^n?
考虑具有状态 space S = {1, 2, 3, 4}
和转移矩阵
的马尔可夫链
P = 0.1 0.2 0.4 0.3
0.4 0.0 0.4 0.2
0.3 0.3 0.0 0.4
0.2 0.1 0.4 0.3
并且,看看下面的源代码:
# markov function
markov <- function(init,mat,n,labels)
{
if (missing(labels))
{
labels <- 1:length(init)
}
simlist <- numeric(n+1)
states <- 1:length(init)
simlist[1] <- sample(states,1,prob=init)
for (i in 2:(n+1))
{
simlist[i] <- sample(states, 1, prob = mat[simlist[i-1],])
}
labels[simlist]
}
# matrixpower function
matrixpower <- function(mat,k)
{
if (k == 0) return (diag(dim(mat)[1]))
if (k == 1) return(mat)
if (k > 1) return( mat %*% matrixpower(mat, k-1))
}
tmat = matrix(c(0.1, 0.2, 0.4, 0.3,
0.4, 0.0, 0.4, 0.2,
0.3, 0.3, 0.0, 0.4,
0.2, 0.1, 0.4, 0.3), nrow=4, ncol=4, byrow=TRUE)
p10 = matrixpower(mat = tmat, k=10)
rowMeans(p10)
nn <- 10
alpha <- c(0.25, 0.25, 0.25, 0.25)
set.seed(1)
steps <- markov(init=alpha, mat=tmat, n=nn)
table(steps)/(nn + 1)
输出
> rowMeans(p10)
[1] 0.25 0.25 0.25 0.25
>
.
.
.
> table(steps)/(nn + 1)
steps
1 2 3 4
0.09090909 0.18181818 0.18181818 0.54545455
> ?rowMeans
为什么结果如此不同?
计算Pn[时使用matrixpower()
和markov()
有什么区别=32=]?
目前您正在比较完全不同的事物。首先,我将不关注计算 Pn,而是关注 A*Pn,其中 A 是初始分布。在那种情况下 matrixpower
完成工作:
p10 <- matrixpower(mat = tmat, k = 10)
alpha <- c(0.25, 0.25, 0.25, 0.25)
alpha %*% p10
# [,1] [,2] [,3] [,4]
# [1,] 0.2376945 0.1644685 0.2857105 0.3121265
这些是在 10 步之后(在使用 A 进行初始抽签之后)分别处于状态 1、2、3、4 的真实概率。
同时,markov(init = alpha, mat = tmat, n = nn)
只是长度nn + 1
的单一实现,只有这个实现的最后一个数字与A*Pn相关。因此,为了尝试获得与理论值相似的数字,我们需要许多 nn <- 10
的实现,如
table(replicate(markov(init = alpha, mat = tmat, n = nn)[nn + 1], n = 10000)) / 10000
#
# 1 2 3 4
# 0.2346 0.1663 0.2814 0.3177
我模拟了 10000 个实现并只采用每个实现的最后状态。
考虑具有状态 space S = {1, 2, 3, 4}
和转移矩阵
P = 0.1 0.2 0.4 0.3
0.4 0.0 0.4 0.2
0.3 0.3 0.0 0.4
0.2 0.1 0.4 0.3
并且,看看下面的源代码:
# markov function
markov <- function(init,mat,n,labels)
{
if (missing(labels))
{
labels <- 1:length(init)
}
simlist <- numeric(n+1)
states <- 1:length(init)
simlist[1] <- sample(states,1,prob=init)
for (i in 2:(n+1))
{
simlist[i] <- sample(states, 1, prob = mat[simlist[i-1],])
}
labels[simlist]
}
# matrixpower function
matrixpower <- function(mat,k)
{
if (k == 0) return (diag(dim(mat)[1]))
if (k == 1) return(mat)
if (k > 1) return( mat %*% matrixpower(mat, k-1))
}
tmat = matrix(c(0.1, 0.2, 0.4, 0.3,
0.4, 0.0, 0.4, 0.2,
0.3, 0.3, 0.0, 0.4,
0.2, 0.1, 0.4, 0.3), nrow=4, ncol=4, byrow=TRUE)
p10 = matrixpower(mat = tmat, k=10)
rowMeans(p10)
nn <- 10
alpha <- c(0.25, 0.25, 0.25, 0.25)
set.seed(1)
steps <- markov(init=alpha, mat=tmat, n=nn)
table(steps)/(nn + 1)
输出
> rowMeans(p10)
[1] 0.25 0.25 0.25 0.25
>
.
.
.
> table(steps)/(nn + 1)
steps
1 2 3 4
0.09090909 0.18181818 0.18181818 0.54545455
> ?rowMeans
为什么结果如此不同?
计算Pn[时使用matrixpower()
和markov()
有什么区别=32=]?
目前您正在比较完全不同的事物。首先,我将不关注计算 Pn,而是关注 A*Pn,其中 A 是初始分布。在那种情况下 matrixpower
完成工作:
p10 <- matrixpower(mat = tmat, k = 10)
alpha <- c(0.25, 0.25, 0.25, 0.25)
alpha %*% p10
# [,1] [,2] [,3] [,4]
# [1,] 0.2376945 0.1644685 0.2857105 0.3121265
这些是在 10 步之后(在使用 A 进行初始抽签之后)分别处于状态 1、2、3、4 的真实概率。
同时,markov(init = alpha, mat = tmat, n = nn)
只是长度nn + 1
的单一实现,只有这个实现的最后一个数字与A*Pn相关。因此,为了尝试获得与理论值相似的数字,我们需要许多 nn <- 10
的实现,如
table(replicate(markov(init = alpha, mat = tmat, n = nn)[nn + 1], n = 10000)) / 10000
#
# 1 2 3 4
# 0.2346 0.1663 0.2814 0.3177
我模拟了 10000 个实现并只采用每个实现的最后状态。