Dizi verilerinden Markov geçiş olasılıklarını tahmin etme


16

4 durum oluşan tam bir dizi dizilim (tam olarak 432 gözlem) var AD: ör.

Y=(ACDDBACBAACABCADABA)

DÜZENLEME : Gözlem dizileri eşit uzunluktadır! Bu bir şeyi değiştirir mi?

Matlab veya R ya da benzerinde geçiş matrisini hesaplamanın bir yolu var mı ? Bence HMM paketi yardımcı olabilir. Düşüncesi olan var mı?

Pij(Yt=j|Yt1=i)

örneğin: Markov zinciri olasılıklarını tahmin etme


3
Şu ana kadar : durumları . Let sayısı olmak zincir durumdan geçiş yapılan durumu için için . Hesaplamak n i j 'daki örnekten s ve geçiş matrisi tahmin ( s ı j ) tahminleri kullanılarak maksimum olabilirlik ile p i j = n i j / Σ 4 j = 1 , n ı j . S = { 1 : = A , 2 : = B , 3 : = C , 4 : = D } n i j i j i j , = 1 , 2 , 3 , 44S={1:=A,2:=B,3:=C,4:=D}nijijij,=1,2,3,4nij(pij)p^ij=nij/j=14nij
Zen

Bu notlar MLE tahminlerini almaktadır: stat.cmu.edu/~cshalizi/462/lectures/06/markov-mle.pdf
Zen


@B_Miner kodunuzu benim için sahte kod biçiminde yazabilir misiniz? Ya da açıklamak gerekirse açıklayın ... Ancak R konsolumda çalıştığını görüyorum.
HCAI

Bir sorum var: Uygulamanızı anladım ve bana iyi geldi, ama neden sadece Matlab hmmestimate işlevini T matrisini hesaplamak için kullanamıyorum diye merak ediyordum? Şuna benzer bir şey: durumlar = [1,2,3,4] [T, E] = hmmestimate (x, durumlar); T, ilgilendiğim geçiş matrisi. Markov zincirleri ve HMM için yeniyim, bu yüzden iki uygulama arasındaki farkı (varsa) anlamak istiyorum.
Herhangi bir

Yanıtlar:


18

Lütfen yukarıdaki yorumları kontrol edin. İşte R'de hızlı bir uygulama.

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, ])

Sonuçlar:

> 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'da (muhtemelen hiç kullanmadım) (muhtemelen aptal değil), bu yüzden bu işe yarayacak mı bilmiyorum. Ben sadece sözdizimi almak için "vektör matrisi ilan MATLAB" googled):

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

Harika görünüyor! Kodunda 3. satırın ne yaptığından emin değilim (esas olarak Matlab'a aşina olduğum için). Matlab veya sözde kodla yazma şansınız var mı? Çok mecbur olurdum.
HCAI

2
Üçüncü satır bunu yapar: zincir değerleri . İçin T = 1 , ... , n - 1 , artım p x t , x t + 1 . x1,,xnt=1,,n1pxt,xt+1
Zen

Dördüncü çizgi, matrisin her bir çizgisini normalleştirir . (pij)
Zen

Buradaki yavaşlığımla çıplak. İlk fordöngüde ne yapmaya çalıştığını hala göremiyorum, ancak MATLAB kod çevirisini takdir ediyorum . Orijinal kodundan 3. satır sayısını sayıyor durumdan gider x i devlet için x j ? Eğer kelimelerle söyleseydin bunu çok takdir ediyorum. Şerefexxixj
HCAI

1
Hayır, sadece bir satırdır. Birleştirmeyin çünkü "false" geçişleri tanıtabilirsiniz: bir satırın son durumu → bir sonraki satırın ilk durumu. Matrisinizin satırları arasında geçiş yapmak ve geçişleri saymak için kodu değiştirmeniz gerekir. Sonunda, geçiş matrisinin her satırını normalleştirin. x
Zen

9

İşte benim 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'in isteği (itibarı olmadığı için yorum yerine düzenleme olarak yayınlandı): markovchainFit sonucunun transitionMatrix'ini data.frame'e nasıl zorlayabilirim?
chl

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

@GiorgioSpedicato eşit olmayan uzunluktaki dizilerle nasıl başa çıkabileceğiniz hakkında yorum yapabilir misiniz (birleştiremiyorum) lütfen paketinizde?
HCAI

@HCAI, lütfen geçerli skeç sayfasına bakınız 35-36
Giorgio Spedicato

@GiorgioSpedicato cran.r-project.org/web/packages/markovchain/vignettes/… referans için teşekkür ederiz . Hala her dizi için bir tane olmak üzere n geçiş matrisi var. Neyin peşindeyim, tüm dizi gözlemlerini dikkate alan genel bir şey. Kaçırdığım bir şey var mı?
HCAI

2

İşte Matlab'da yapmanın bir yolu:

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'a teşekkür borçları: http://www.eng-tips.com/viewthread.cfm?qid=236532

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.