我很难建立一个递归函数,最好通过一个简单的例子说明。
采用具有2种状态的马尔可夫过程,状态1和状态2.符号 p_ij 表示转换到状态 j 的概率,前提是当前状态为 I 的。在这个例子中,
转移概率矩阵是:
import numpy as np
pij = np.array([[.8, .2], [.6, .4]])
print(pij)
# [[ 0.8 0.2]
# [ 0.6 0.4]]
n - 步骤转移概率,表示为 r_ij(n),表示 n 时间段之后的状态将< em> j ,假设当前状态为 i 。 r_ij(n)可以使用Chapman-Kolmogorov方程找到,
初始条件
m 是州的总数。 [来自Bertsekas / Tsitsiklis,2008年。]
我正在尝试构建 r_ij(n)。前5个步骤应如下所示:
我的开始:
def r(p, n):
m = np.sqrt(p.size) # or p.shape[0]
if n == 1:
return p
elif n > 1:
res = []
for k in range(m):
for i in p:
for j in i:
# This line is patently wrong...
# Not sure how to reference i
return r(n - 1) * p[k, j]
return np.sum(res)
p0 = np.array([[.8, .2], [.6, .4]])
print(r(p0, n=5))
# [[.7501, .2499],
# [.7498, .2502]]
但我对这个符号有点失落。
答案 0 :(得分:2)
您不一定需要递归功能。 matrix_power
基本上是rij
您正在寻找:
def rij(pij, n):
return matrix_power(pij, n)
pij = np.array([[.8, .2], [.6, .4]])
from numpy.linalg.linalg import matrix_power
matrix_power(pij, 2)
#array([[ 0.76, 0.24],
# [ 0.72, 0.28]])
matrix_power(pij, 3)
#array([[ 0.752, 0.248],
# [ 0.744, 0.256]])
matrix_power(pij, 4)
#array([[ 0.7504, 0.2496],
# [ 0.7488, 0.2512]])
matrix_power(pij, 5)
#array([[ 0.75008, 0.24992],
# [ 0.74976, 0.25024]])
要定义递归函数,np.dot
将使任务更容易:
def rij(pij, n):
if n == 1:
return pij
else:
return np.dot(rij(pij, n-1), pij)
rij(pij, 5)
#array([[ 0.75008, 0.24992],
# [ 0.74976, 0.25024]])