【问题标题】:Numpy Linalg on transition matrix转换矩阵上的 Numpy Linalg
【发布时间】:2021-12-14 11:36:50
【问题描述】:

我有以下状态

states = [(0,2,3,0), (2,2,3,0), (2,2,2,0), (2,2,1,0)]

另外,我还有下面的转移矩阵

import pandas as pd

transition_matrix = pd.DataFrame([[1, 0, 0, 0],
                                  [0.5, 0.3, 0.2, 0],
                                  [0.5, 0.3, 0, 0.2],
                                  [0.5, 0.5, 0, 0]], columns=states, index=states)

因此,如果您处于状态 (2,2,1,0),那么您有 50% 的可能性进入状态 (0,2,3,0),并且有 50% 的可能性进入状态 (2,2,3,0)

如果你处于状态(0,2,3,0),吸收状态,你赢了。

我们可以写出以下等式

p_win_(0,2,3,0) = 1
p_win_(2,2,3,0) = 0.50 * p_win_(0,2,3,0) + 0.3 * p_win(2,2,3,0) + 0.2 * p_win(2,2,2,0)
p_win_(2,2,2,0) = 0.50 * p_win_(0,2,3,0) + 0.3 * p_win(2,2,3,0) + 0.2 * p_win(2,2,1,0)
p_win_(2,2,1,0) = 0.50 * p_win_(0,2,3,0) + 0.5 * p_win(2,2,3,0) 

我想解决上面的公式。我查看了np.linalg.solve 函数的documentation。该示例没有使用已定义的变量,此外,我在等号的两边都有术语。

请告诉我如何解决上述问题。

【问题讨论】:

    标签: numpy linear-algebra markov


    【解决方案1】:

    首先,你的第一个等式是错误的(应该是p_win_(0,2,3,0) = 1* p_win_(0,2,3,0)) 您本质上是在尝试获得转换矩阵的最大特征向量(对应于 eig=1)。 p_win_ 由以下因素决定:

    v = Pv (or P-I)v, sum(v) = 1, 其中I是单位矩阵np.eye(4)

    我们可以把它写成扩展形式:

    I = np.eye(4)
    P = np.array([[1, 0, 0, 0],
                  [0.5, 0.3, 0.2, 0],
                  [0.5, 0.3, 0, 0.2],
                  [0.5, 0.5, 0, 0]]) # if you already have it in DataFrame,
                                     # you can alternatively do:
    # P = transition_matrix.to_numpy()
    extend_m = np.concatenate((P-I, np.ones((1,4), axis=0)) 
    # Equation to solve is extend_m*v = np.array([0,1])
    

    所以解决方案由下式给出

    v = np.linalg.lstsq(extend_m, np.array([0,1])
    

    我使用lstsq,因为我们有一个超定系统(5 个方程,4 个未知数)。如果你想使用np.linalg.solve,你需要把它减少到4个方程,我留给你(在这种特殊情况下,有一个明显多余的方程,你可以删除它)。

    【讨论】:

      猜你喜欢
      • 2022-11-29
      • 2019-12-12
      • 2016-09-28
      • 2016-08-25
      • 1970-01-01
      • 2011-08-27
      • 2014-12-21
      • 1970-01-01
      • 2017-05-17
      相关资源
      最近更新 更多