马尔可夫模型的多重转移

0 投票
1 回答
1312 浏览
提问于 2025-05-10 10:03

我正在尝试将一个数据框通过多个马尔可夫模型的转换来进行课堂作业。

这个数据框的样子是这样的:

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

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

撰写回答