Я получил этот код:Python код объяснение для стационарного распределения цепи Маркова
import numpy as np
from scipy.linalg import eig
transition_mat = np.matrix([
[.95, .05, 0., 0.],\
[0., 0.9, 0.09, 0.01],\
[0., 0.05, 0.9, 0.05],\
[0.8, 0., 0.05, 0.15]])
S, U = eig(transition_mat.T)
stationary = np.array(U[:, np.where(np.abs(S - 1.) < 1e-8)[0][0]].flat)
stationary = stationary/np.sum(stationary)
>>> print stationary
[ 0.34782609 0.32608696 0.30434783 0.02173913]
Но я не могу понять линию:
stationary = np.array(U[:, np.where(np.abs(S - 1.) < 1e-8)[0][0]].flat)
Может кто-нибудь объяснить часть: U[:, np.where(np.abs(S - 1.) < 1e-8)[0][0]].flat
?
Я знаю, что процедура возвращает S
: собственное значение, U
: собственный вектор. Мне нужно найти собственный вектор, соответствующий собственному значению 1. Я написал код ниже:
for i in range(len(S)):
if S[i] == 1.0:
j = i
matrix = np.array(U[:, j].flat)
Я получаю выход:
: [ 0.6144763 0.57607153 0.53766676 0.03840477]
, но это не дает тот же результат. Зачем?!
Хм ... Это * смотрит *, как это захват элементов из U где соответствующий элемент в S имеет значение 1 ... но я не уверен, для чего это '[0] [0]'. Затем он выравнивает все это в одномерный массив. – Kevin
Привет, Кевин, спасибо за ответ. может у, пожалуйста, скажите мне, как этот код: где (np.abs (S-1.) <1e-8) должен работать? –
Вы пробовали это на простом примере? Прочтите любую документацию? Что именно * вас смущает? – jonrsharpe