从矩阵乘法的角度理解马尔可夫链
Understanding Markov Chains in terms of Matrix Multiplication
在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]]
。我哪里错了,或者我在这里不明白什么?
表达式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
是所需的功率。
坚持使用圆点。
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)
是正确的。
在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]]
。我哪里错了,或者我在这里不明白什么?
表达式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
是所需的功率。
坚持使用圆点。
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)
是正确的。