2015-04-21 3 views
2

В a lecture on YouTube, профессор сказала цепь Маркова может быть упрощена Start(S) * Transition Matrix(Q)^State#Понимание цепи Маркова в терминах умножения матриц

Я пытаюсь повторить это с помощью NumPy.

import numpy as np 
S = np.zeros(shape=(1,2)) 
Q = np.zeros(shape=(2,2)) 

#starting state 
S[0] = [.2,.8] 

#transition matrix 
Q[0] = [.9, .1] 
Q[1] = [.7, .3] 

Если я print S.dot(Q).dot(Q), это дает мне [[0.848 0.152]], который, как представляется, правильный ответ (в двух шагах в будущее).

Однако, это точно не так, как SQ^x, поэтому я пробовал print S.dot(np.power(Q,2)), но это дает мне [[0.554 0.074]]. Где я иду не так, или что я не понимаю здесь?

ответ

7

Выражения S.dot(Q).dot(Q) и S.dot(np.power(Q,2)) - это не одно и то же. Первое - это поведение, которое вы желаете, а S.dot(np.power(Q,2)) поднимает каждый элемент в Q ко второй мощности. Документация here.

Для более компактной записи, чем раз цепочек .dot(Q), использовать:

S.dot(np.linalg.matrix_power(Q,n)) 

, где находится n требуемой мощности.

4

Палочка с точкой.
np.power или * Оператор - элементное умножение. Посмотрите:

print Q.dot(Q) 

принтами:

[[ 0.88 0.12] 
[ 0.84 0.16]] 

который, что я получаю от руки. Принимая во внимание,

print np.power(Q, 2) 
print Q * Q 

и печати:

[[ 0.81 0.01] 
[ 0.49 0.09]] 

Так S.dot(Q).dot(Q) правильно.

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