Numpy Linalg на матрице перехода

#numpy #linear-algebra #markov

Вопрос:

У меня есть следующие состояния

 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 -function . В примере не используются определенные переменные, и, кроме того, у меня есть термины по обе стороны от знака равенства.

Пожалуйста, покажите мне, как я могу решить вышеизложенное.

Ответ №1:

Во-первых, ваше первое уравнение неверно (оно должно быть p_win_(0,2,3,0) = 1* p_win_(0,2,3,0)) По сути, вы пытаетесь получить наибольший собственный вектор (соответствующий eig = 1) для матрицы перехода. p_win_ определяется:

v = Pv (или P-I) v, сумма (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 уравнений, которые я оставляю на ваше усмотрение (в данном конкретном случае есть одно явно избыточное уравнение, которое вы можете просто удалить).