/ /行列乗算の観点からマルコフ連鎖を理解する - python、numpy、確率、マルコフ連鎖

行列の乗算の観点からのマルコフ連鎖の理解 - python、numpy、probability、markov-chains

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) 正しい。