Ước tính xác suất chuyển đổi Markov từ dữ liệu chuỗi


16

Tôi có một bộ đầy đủ các chuỗi (chính xác là 432 quan sát) của 4 trạng thái : vdAD

Y=(ACDDBACBAACABCADABA)

EDIT : Trình tự quan sát có độ dài không bằng nhau! Điều này có thay đổi gì không?

Có cách tính ma trận chuyển tiếp trong Matlab hoặc R hoặc tương tự không? Tôi nghĩ rằng gói HMM có thể giúp đỡ. Có suy nghĩ gì không?

Pij(Yt=j|Yt1=i)

ví dụ: Ước tính xác suất chuỗi Markov


3
Bạn có trạng thái: . Đặt là số lần chuỗi thực hiện chuyển đổi từ trạng thái sang trạng thái , với ij, = 1,2,3,4 . Tính toán n_ {ij} từ mẫu của bạn và ước tính ma trận chuyển tiếp (p_ {ij}) theo khả năng tối đa bằng cách sử dụng các ước tính \ hat {p} _ {ij} = n_ {ij} / \ sum_ {j = 1} ^ 4 n_ {ij} . S = { 1 : = A , 2 : = B , 3 : = C , 4 : = D } n i j i j i j , = 1 , 2 , 3 , 4 n i j ( p i j )4S= ={1: =Một,2: =B,3: =C,4: =D}nTôijTôijTôij,= =1,2,3,4nTôij(pTôij)p^Tôij= =nTôij/Σj= =14nTôij
Zen

Những ghi chú này rút ra ước tính MLE: stat.cmu.edu/~cshalizi/462/lectures/06/markov-mle.pdf
Zen


@B_Miner bạn có thể viết mã của bạn dưới dạng mã giả cho tôi không? Hoặc giải thích nó theo thuật ngữ lay ... Tuy nhiên tôi thấy nó hoạt động trong bảng điều khiển R của tôi.
HCAI

Tôi có một câu hỏi: Tôi hiểu việc triển khai của bạn và nó rất tốt đối với tôi, nhưng tôi đã tự hỏi tại sao tôi không thể đơn giản sử dụng hàm hmmestimate Matlab để tính ma trận T? Một cái gì đó như: state = [1,2,3,4] [T, E] = hmmestimate (x, state); Trong đó T là ma trận chuyển tiếp mà tôi quan tâm. Tôi mới biết về chuỗi Markov và HMM vì vậy tôi muốn hiểu sự khác biệt giữa hai triển khai (nếu có).
Bất kỳ

Câu trả lời:


18

Xin vui lòng, kiểm tra các ý kiến ​​trên. Đây là một triển khai nhanh trong 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, ])

Các kết quả:

> 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

Việc triển khai (có lẽ là ngớ ngẩn) trong MATLAB (mà tôi chưa bao giờ sử dụng, vì vậy tôi không biết điều này có hiệu quả hay không. Tôi vừa mới googled "khai báo ma trận vector MATLAB" để lấy cú pháp):

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

Trông rất tuyệt! Tôi không chắc chắn dòng thứ 3 làm gì trong mã của bạn (chủ yếu vì tôi quen với Matlab). Bất kỳ cơ hội nào bạn có thể viết nó bằng matlab hoặc mã giả? Tôi sẽ có nhiều nghĩa vụ.
HCAI

2
Dòng thứ ba thực hiện điều này: các giá trị chuỗi là . Với , tăng . x1,Giáo dục,xnt= =1,Giáo dục,n-1pxt,xt+1
Zen

Dòng thứ tư chuẩn hóa từng dòng của ma trận . (pTôij)
Zen

Bare với sự chậm chạp của tôi ở đây. Tôi đánh giá cao bản dịch mã MATLAB mặc dù tôi vẫn không thể thấy những gì nó đang cố gắng thực hiện trong forvòng lặp đầu tiên của bạn . Dòng thứ 3 từ mã gốc đang đếm số lần đi từ trạng thái sang trạng thái ? Nếu bạn có thể nói nó bằng lời tôi sẽ đánh giá cao điều đó rất nhiều. Chúc mừngxxTôixj
HCAI

1
Không, chỉ là một hàng. Đừng nối lại vì bạn sẽ giới thiệu các chuyển tiếp "sai": trạng thái cuối cùng của một dòng trạng thái đầu tiên của dòng tiếp theo. Bạn phải thay đổi mã để lặp qua các dòng của ma trận và đếm số lần chuyển đổi. Cuối cùng, bình thường hóa từng dòng của ma trận chuyển tiếp. x
Zen

9

Đây là triển khai của tôi trong 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
Yêu cầu của user32041 (được đăng dưới dạng chỉnh sửa thay vì nhận xét vì anh ấy / cô ấy thiếu danh tiếng): Làm cách nào tôi có thể ép buộc quá trình chuyển đổiMatrix của kết quả markovchainFit thành data.frame?
chl

dmộttmột.frmộtmemộtS(mcX,"dmộttmột.frmộtme")

@GiorgioSpedicato bạn có thể nhận xét về cách xử lý các chuỗi có độ dài không bằng nhau (tôi không thể nối) xin vui lòng trong gói của bạn?
HCAI

@HCAI, vui lòng xem trang họa tiết hiện tại 35-36
Giorgio Speesato

@GiorgioSpedicato cảm ơn bạn đã tham khảo cran.r-project.org/web/packages/markovchain/vignettes/ chất . Tôi vẫn có n ma trận chuyển tiếp, một cho mỗi chuỗi. Những gì tôi đang theo là một cái chung có tính đến tất cả các quan sát trình tự. Có thiếu điều gì không?
HCAI

2

Đây là một cách để làm điều đó trong 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))

Lời cảm ơn còn nợ SomptingGuy: http://www.eng-tips.com/viewthread.cfm?qid=236532

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.