0

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

数据框如下所示:

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 次。

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

4

1 回答 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 至关重要。

此代码复制了 Wikipedia 中的示例:

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])
于 2015-11-17T04:12:09.930 回答