시퀀스 데이터에서 Markov 전환 확률 추정


16

4 가지 상태 의 전체 시퀀스 세트 (정확한 432 개의 관측치)가 있습니다 .AD

와이=()

편집 : 관찰 시퀀스 길이가 동일하지 않습니다! 이것으로도 변화가 있습니까?

전이 행렬 P i j ( Y t = j | Y t 1 = i ) 를 계산하는 방법이 있습니까?

나는제이(와이=제이|와이1=나는)
Matlab 또는 R 등에서 있습니까? HMM 패키지가 도움이 될 것이라고 생각합니다. 이견있는 사람?

예 : Markov 체인 확률 추정


3
4S={1:=A,2:=B,3:=C,4:=D}nijijij,=1,2,3,4nij(pij)p^ij=nij/j=14nij

이 노트는 MLE 추정치를 도출합니다. stat.cmu.edu/~cshalizi/462/lectures/06/markov-mle.pdf
Zen


@B_Miner 의사 코드 형태로 코드를 작성할 수 있습니까? 또는 일반 용어로 설명하십시오 ...하지만 R 콘솔에서 작동하는 것으로 보입니다.
HCAI

질문이 있습니다. 구현을 이해하고 나에게 잘 맞지만 왜 Matlab hmmestimate 함수를 사용하여 T 행렬을 계산할 수 없는지 궁금합니다. 다음과 같은 것 : states = [1,2,3,4] [T, E] = hmmestimate (x, states); 여기서 T는 내가 관심있는 전이 행렬입니다. Markov 체인과 HMM을 처음 사용하므로 두 구현 간의 차이점을 이해하고 싶습니다 (있는 경우).
모든

답변:


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에서 (아마도 멍청한) 구현 (아직 사용하지 않았으므로 이것이 작동하는지 모르겠습니다. 구문을 얻기 위해 "벡터 행렬 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

좋아 보인다! 그래도 코드에서 세 번째 줄이 무엇을하는지 잘 모르겠습니다 (주로 Matlab에 익숙하기 때문에). matlab 또는 의사 코드로 작성할 수 있습니까? 나는 많은 의무가있다.
HCAI

2
세 번째 줄은 이것을 수행합니다. 체인 값은 엑스1,,엑스. 에 대한=1,,1, 증분 엑스,엑스+1.
Zen

네 번째 줄은 행렬의 각 줄을 정규화합니다 (나는제이).
Zen

내 속도가 느려졌 어. MATLAB 코드 변환에 감사하지만 여전히 첫 번째 for루프 에서 수행하려는 작업을 볼 수 없습니다 . 원래 코드의 세 번째 줄은 횟수를 세고 있습니다.엑스 주에서 간다 엑스나는 상태로 엑스제이? 당신이 말로 말할 수 있다면 나는 그것을 많이 감사하겠습니다. 건배
HCAI

1
아니, 엑스하나의 행입니다. "거짓"전환이 발생하므로 연결하지 마십시오. 한 줄의 마지막 상태 first state of the next line. You have to change the code to loop through the lines of your matrix and count the transitions. At the end, normalize each line of the transition matrix.
Zen

9

Here is my implementation in 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's request (posted as an edit instead of a comment since he/she lacks reputation): How can I coerce the transitionMatrix of the markovchainFit result to a data.frame?
chl

You can convert to data.frame using as(mcX,"data.frame")
Giorgio Spedicato

@GiorgioSpedicato 패키지에 길이가 다른 시퀀스를 처리하는 방법에 대해 언급 할 수 있습니까?
HCAI

@HCAI는 현재 네트 페이지 35 ~ 36 참조하십시오
조르지오 Spedicato

@GiorgioSpedicato는 참조 주셔서 감사합니다 cran.r-project.org/web/packages/markovchain/vignettes/... . 나는 여전히 각 시퀀스마다 하나씩 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.