马尔可夫模型的多次转换



我试图通过类的马尔可夫模型的多次转换来运行数据帧。

数据帧如下所示:

df = pd.DataFrame({'Bull Market': [.9, .8, .5],
                   'Bear Market': [.25, .05, .25],
                   'Stagnant Market': [.75, .15, .25]
                  },
                  index=["Bull Market", "Bear Market", "Stagnant Market"])

我有两次运行它的代码:

print(df.dot(df))

我需要在模型中运行X次。我很难在dot()上找到文档,但从我发现的情况来看,似乎无法将其运行X次。

任何帮助都将不胜感激,谢谢!

这不是马尔可夫链的工作方式。您需要一个起始状态(在这种情况下,为[1,0,0]、[0,1,0]或[0,0,1]),然后将过渡矩阵乘以状态向量,然后将转换矩阵乘以新获得的状态向量,等等。您不会将过渡矩阵本身相乘。如果你需要计算特定次数的转换后会发生什么,你可以循环X次并执行X矩阵向量乘法。如果你想要稳态,你需要找到主特征向量,这可以使用numpy.linalg.eig来完成。还要注意,这对你的转换矩阵不起作用,因为这些行不是概率分布。

编辑:好吧,我想我明白你想做什么了。因为矩阵向量乘法的工作方式,你也可以对矩阵求幂,然后乘以起始状态向量,得到与迭代乘以每个中间结果相同的结果。您可以使用numpy.linalg.matrix_power来执行此操作。我看到你从维基百科上得到了这个矩阵。你只是把其中一些数字弄错了,即应该是0.025,而不是0.25。至关重要的是,每一行的总和为1。

此代码复制了维基百科中的示例:

import numpy as np
T = np.array([[0.9, 0.075, 0.025],
              [0.15, 0.8, 0.05],
              [0.25, 0.25, 0.5]])
start = np.array([0, 1, 0])
def find_state_after_n(start, T, n):
    Tmult = np.linalg.matrix_power(T, n)
    state = np.dot(start, Tmult)
    return state
find_state_after_n(start, T, 3)
array([ 0.3575 ,  0.56825,  0.07425])

最新更新