シーケンスデータからのマルコフ遷移確率の推定


16

私は4つの状態のシーケンスのセット(正確には432の観測)を持っています:例AD

Y=(ACDDBACBAACABCADABA)

編集:観測シーケンスの長さが等しくありません!これは何かを変えますか?

MatlabまたはRなどで遷移行列を計算する方法はありますか?HMMパッケージが役立つと思います。何かご意見は?

Pij(Yt=j|Yt1=i)

例:マルコフ連鎖確率の推定


3
あなたが持っている:状態S = { 1 = A 2 = B 3 = C 4 = Dを}。ましょN I jは鎖状態からの遷移からなる回数であるの状態にJをするために、I 、J = 1 2 3 4n i jを計算する4S={1:=A,2:=B,3:=C,4:=D}nijijij,=1,2,3,4nij「あなたのサンプルからS及び遷移行列推定推定値を用いて最尤によってP、I 、J = N I J / Σ 4 J = 1 N I J(pij)p^ij=nij/j=14nij

これらの注記は、MLEの推定値を導き出します。stat.cmu.edu
Zen


@B_Minerは私のためにあなたのコードを擬似コード形式で書くことができますか?または、わかりやすい言葉で説明してください...しかし、私はそれが私のRコンソールで動作しているのを見ます。
HCAI

私は質問があります:私はあなたの実装を理解しており、それは私には問題ありませんが、T Matrixを計算するためにMatlab hmmestimate関数を単純に使用できないのはなぜですか?次のようなもの:states = [1,2,3,4] [T、E] = hmmestimate(x、states); ここで、Tは興味のある遷移行列です。マルコフ連鎖とHMMは初めてなので、2つの実装の違いを理解したいと思います(ある場合)。
任意の

回答:


18

上記のコメントを確認してください。Rでの簡単な実装を次に示します。

x <- c(1,2,1,1,3,4,4,1,2,4,1,4,3,4,4,4,3,1,3,2,3,3,3,4,2,2,3)
p <- matrix(nrow = 4, ncol = 4, 0)
for (t in 1:(length(x) - 1)) p[x[t], x[t + 1]] <- p[x[t], x[t + 1]] + 1
for (i in 1:4) p[i, ] <- p[i, ] / sum(p[i, ])

結果:

> p
          [,1]      [,2]      [,3]      [,4]
[1,] 0.1666667 0.3333333 0.3333333 0.1666667
[2,] 0.2000000 0.2000000 0.4000000 0.2000000
[3,] 0.1428571 0.1428571 0.2857143 0.4285714
[4,] 0.2500000 0.1250000 0.2500000 0.3750000

MATLABでの(おそらく愚かな)実装(これは使用したことがないので、これが機能するかどうかはわかりません。構文を取得するために "declare vector matrix MATLAB"を検索しました):

x = [ 1, 2, 1, 1, 3, 4, 4, 1, 2, 4, 1, 4, 3, 4, 4, 4, 3, 1, 3, 2, 3, 3, 3, 4, 2, 2, 3 ]
n = length(x) - 1
p = zeros(4,4)
for t = 1:n
  p(x(t), x(t + 1)) = p(x(t), x(t + 1)) + 1
end
for i = 1:4
  p(i, :) = p(i, :) / sum(p(i, :))
end

素晴らしく見える!ただし、コードの3行目が何をするのかわかりません(主にMatlabに精通しているため)。あなたはそれをmatlabまたは擬似コードで書くことができますか?私は多くの義務を負います。
HCAI

2
x1,,xnt=1,,n1pxt,xt+1

(pij)

forxxixj

1
x

9

ここに私のRでの実装があります

x <- c(1,2,1,1,3,4,4,1,2,4,1,4,3,4,4,4,3,1,3,2,3,3,3,4,2,2,3)
xChar<-as.character(x)
library(markovchain)
mcX<-markovchainFit(xChar)$estimate
mcX

1
user32041のリクエスト(評判が悪いためコメントではなく編集として投稿):markovchainFit結果のtransitionMatrixをdata.frameに強制するにはどうすればよいですか?
chl

data.frameas(mcX,"data.frame")

@GiorgioSpedicatoは、パッケージ内で不均等な長さのシーケンス(連結できません)を処理する方法についてコメントできますか?
HCAI

@HCAI、現在のビネットページ35-36をご覧ください
ジョルジオスペディカート

@GiorgioSpedicatoは参考のためにあなたに感謝cran.r-project.org/web/packages/markovchain/vignettes/...。シーケンスごとに1つずつ、n個の遷移行列がまだあります。私が望んでいるのは、すべてのシーケンス観測を考慮に入れた一般的なものです。私が見逃しているものはありますか?
HCAI

2

Matlabでそれを行う方法は次のとおりです。

x = [1,2,1,1,3,4,4,1,2,4,1,4,3,4,4,4,3,1,3,2,3,3,3,4,2,2,3];
counts_mat = full(sparse(x(1:end-1),x(2:end),1));
trans_mat = bsxfun(@rdivide,counts_mat,sum(counts_mat,2))

SomptingGuyに対する謝辞:http ://www.eng-tips.com/viewthread.cfm ? qid = 236532

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.