12/13 プログラミングセミナー

MikuHatsune2010-12-13

前の記事先生の漸化式からの続き。
あるイニングの得点と、1イニングあたりに取る得点の確率から、次のイニングでの得点が帰納的に求められる的な話題。
ここで、推移行列というものについて。
あるイニングtで得点kを取る確率が収まっている行ベクトルP_{t}=(p_{t}(0),p_{t}(1),p_{t}(1),\hspace{3},,,,\hspace{3}p_{t}(k),\hspace{3},,,,\hspace{3}p_{t}(n-1))^'と、次のイニングでのP_{t+1}の関係は、推移行列Mを用いて
P_{t+1}=MP_{t}
と書ける。ここで、Mの満たす条件というものがあって、P_{t}の要素数がn個だとすると
・N行N列
 N個の要素があるP_{t}が、同じくN個の要素があるP_{t+1}に推移するのだから、そうだね。
・成分の取りうる値は0〜1
 成分はそれぞれ確率なので。
・すべての列について和が1
 P_{t}のj項目がP_{t+1}のj項目に推移するには、P_{t+1}のj項目から出るN本の矢を考えないといけない。
\hspace{20}P_{t+1}\hspace{20}=\hspace{40}M\hspace{65}P_{t}
\begin{pmatrix}\vdots\\\vdots\\\vdots\\p_{t+1}(j)\\\vdots\\\vdots\\\vdots\end{pmatrix}=\begin{pmatrix}\dots&p_{1,j}&\dots\\\dots&p_{2,j}&\dots\\\dots&p_{3,j}&\dots\\\vdots&\vdots&\vdots\\\dots&p_{i,j}&\dots\\\vdots&\vdots&\vdots\\\dots&p_{n,j}&\dots\end{pmatrix}\begin{pmatrix}\vdots\\\vdots\\\vdots\\p_{t}(j)\\\vdots\\\vdots\\\vdots\end{pmatrix}
NKによると、今回は推移確率がどの過程でも一定な、マルコフ過程の特別な場合らしい。
一般にマルコフ過程では、推移確率Q_{n}を用いて
P_{n+1}=Q_{n}P_{n}
となるらしい。
先生のをちょっとパクッたスクリプト

library(MCMCpack)
score<- 5                                                     # 1イニングの最大得点。
Ninning<- 9                                                   # やるイニング回数。
Result<- rdirichlet(1,rep(1,score+1))                         # 得点確率。
M<- matrix(0,                                                 # 推移行列。
           nr=(length(Result)-1)*Ninning+length(Result),
           nc=(length(Result)-1)*Ninning+1)
M[1:length(Result),1]<- Result 
m<- matrix(M[1:ncol(M),1],nc=1)
for(j in 2:ncol(M)){
  M[j:(length(Result)+j-1),j]<- Result
}
colSums(M)                                                    # 列の和が1になることを確認。
M<- head(M,n=ncol(M))
library(expm)
Rinning<- M %^% (Ninning-1) %*% m                             # 結果。
plot(Rinning,type="l")

# 前の記事のtを使って
Rinning/t                                                     # すべて1

M^nをnステップ推移行列というらしい。byNK