在a lecture on YouTube中,一位教授说Markov Chains可以简化为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]]
。我哪里出错了,或者我在这里不懂什么?
答案 0 :(得分: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
是所需的力量。
答案 1 :(得分: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)
是正确的。