转换矩阵上的 Numpy Linalg
Numpy Linalg on transition matrix
我有以下状态
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。该示例不使用定义的变量,此外,我在等号两边都有术语。
请告诉我如何解决上述问题。
首先,你的第一个等式是错误的(应该是p_win_(0,2,3,0) = 1* p_win_(0,2,3,0))
您实质上是在尝试为转移矩阵获取最大的特征向量(对应于 eig=1)。 p_win_ 由以下因素决定:
v = Pv(或 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 个方程,我留给你(在这种特殊情况下,有一个明显多余的方程,你可以删除)。
我有以下状态
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。该示例不使用定义的变量,此外,我在等号两边都有术语。
请告诉我如何解决上述问题。
首先,你的第一个等式是错误的(应该是p_win_(0,2,3,0) = 1* p_win_(0,2,3,0))
您实质上是在尝试为转移矩阵获取最大的特征向量(对应于 eig=1)。 p_win_ 由以下因素决定:
v = Pv(或 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 个方程,我留给你(在这种特殊情况下,有一个明显多余的方程,你可以删除)。