に 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]]
これは正しい答えのように見えます(未来への2つのステップ)。
ただし、これはまったく同じようには見えません。 SQ^x
だから、私は試した print S.dot(np.power(Q,2))
しかし、それは私に与えます [[0.554 0.074]]
。どこが間違っているのですか、それとも何がわからないのですか。
回答:
回答№1の場合は7式 S.dot(Q).dot(Q)
そして S.dot(np.power(Q,2))
同じことではありません。最初はあなたが望む行動ですが、 S.dot(np.power(Q,2))
の各要素を上げる Q
第二の力に。ドキュメンテーション ここに.
繰り返し連鎖するよりもコンパクトな表記法 .dot(Q)
、 つかいます:
S.dot(np.linalg.matrix_power(Q,n))
どこで n
望ましい力です。
回答№2については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)
正しい。