【问题标题】:multiple transitions of Markov model马尔可夫模型的多次转换
【发布时间】:2015-11-17 02:16:11
【问题描述】:

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

数据框如下所示:

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

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

【问题讨论】:

    标签: python pandas markov-chains markov-models


    【解决方案1】:

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

    【讨论】:

    • 感谢您的帮助。我根据为我的班级提供的图表创建了矩阵,其中包含三个不同的项目/列(我不知道正确的术语。)给我的示例问题只有两个,所以我很困惑如何将三列矩阵放在一起以等于 1。我的设置等于 1,只是没有按照您提到的正确顺序。我将查看您的代码以及您找到的 Wikipedia 条目。附加说明,在给出的示例中,列等于 1 而不是行。我将继续研究更多这样的实际例子。
    • 无论哪种方式实际上都有效。如果您使用此矩阵的转置使列总和为 1 而不是行,则您只需要右乘即可,即上面将 state = np.dot(start, Tmult) 更改为 state = np.dot(Tmult, start)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多