马尔可夫模型的多重跃迁

2024-09-30 20:31:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过一个类的Markov模型的多个转换来运行一个数据帧。在

数据框如下所示:

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

我有两次运行的代码:

^{pr2}$

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

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


Tags: 数据代码文档模型dataframedfindexmarket
1条回答
网友
1楼 · 发布于 2024-09-30 20:31:56

这不是马尔可夫链的工作方式。你需要一个起始状态(在本例中,可以是[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])

相关问题 更多 >