2015-08-03 2 views
0

Я получил этот код: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] 

, но это не дает тот же результат. Зачем?!

+0

Хм ... Это * смотрит *, как это захват элементов из U где соответствующий элемент в S имеет значение 1 ... но я не уверен, для чего это '[0] [0]'. Затем он выравнивает все это в одномерный массив. – Kevin

+0

Привет, Кевин, спасибо за ответ. может у, пожалуйста, скажите мне, как этот код: где (np.abs (S-1.) <1e-8) должен работать? –

+0

Вы пробовали это на простом примере? Прочтите любую документацию? Что именно * вас смущает? – jonrsharpe

ответ

0
stationary = np.array(U[:,np.where(np.abs(S-1.) < 1e-8)[0][0]].flat) 

Этот фрагмент кода является поиск элементов в U, который соответствующее собственное значение - 1 меньше, чем 1e-8

Смежные вопросы