马尔可夫模型的多重转换

时间:2015-11-17 02:16:11

标签: python pandas markov-chains markov-models

我正在尝试通过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"])

我有两次运行它的代码:

print(df.dot(df))

我需要在模型中运行X次。我很难在dot()上找到文档,但是根据我的确发现,看起来你不能运行X次。

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

1 个答案:

答案 0 :(得分: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])