用于过渡概率的递归函数(Chapman-Kolmogorov eq。)

时间:2017-10-08 01:25:48

标签: python numpy recursion

我很难建立一个递归函数,最好通过一个简单的例子说明。

采用具有2种状态的马尔可夫过程,状态1和状态2.符号 p_ij 表示转换到状态 j 的概率,前提是当前状态为 I 的。在这个例子中,

  • p_11 = 0.8(在给定当前状态的情况下停留在状态1的概率是状态1)
  • p_12 = 0.2
  • p_21 = 0.6
  • p_22 = 0.4

转移概率矩阵是:

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方程找到,

enter image description here

初始条件

enter image description here

m 是州的总数。 [来自Bertsekas / Tsitsiklis,2008年。]

我正在尝试构建 r_ij(n)。前5个步骤应如下所示:

enter image description here

我的开始

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]]

但我对这个符号有点失落。

1 个答案:

答案 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]])