Оцінка ймовірностей переходу Маркова з даних послідовностей


16

У мене є повний набір послідовностей (якщо бути точними 432 спостереження) 4 станів : напрAD

Y=(ACDDBACBAACABCADABA)

EDIT : Послідовності спостереження мають неоднакову довжину! Це щось змінює?

Чи існує спосіб обчислення матриці переходу в Matlab або R або подібному? Я думаю, що пакет HMM може допомогти. Будь-які думки?

Pij(Yt=j|Yt1=i)

наприклад: Оцінка ймовірностей ланцюга Маркова


3
У вас є стану: . Нехай - кількість разів, коли ланцюг здійснив перехід від стану до стану , для . Обчисліть з вашої вибірки та оцініть матрицю переходу за максимальною ймовірністю, використовуючи оцінки \ hat {p} _ {ij} = n_ {ij} / \ sum_ {j = 1} ^ 4 n_ {ij} . 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
Дзен

2
Подібне запитання: stats.stackexchange.com/questions/26722/…
B_Miner

@B_Miner ви могли б написати свій код у формі псевдо-коду для мене? Або поясніть це просто, але я бачу, що він працює в моїй консолі R.
HCAI

У мене виникає питання: я розумію вашу реалізацію, і мені це добре підходить, але мені було цікаво, чому я не можу просто використовувати функцію hmmestimate Matlab для обчислення матриці T? Щось на кшталт: state = [1,2,3,4] [T, E] = hmmestimate (x, state); де Т - матриця переходу, що мене цікавить. Я новачок у ланцюгах Маркова та HMM, тому я хотів би зрозуміти різницю між двома реалізаціями (якщо такі є).
Будь-який

Відповіді:


18

Перевірте коментарі вище. Ось швидка реалізація в Р.

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

Виглядає здорово! Я не впевнений, що робить 3-й рядок у вашому коді (головним чином тому, що я знайомий з Matlab). Будь-який шанс ви могли написати це в matlab або псевдо-коді? Я був би дуже зобов'язаний.
HCAI

2
Третій рядок робить це: значення ланцюга . Для t = 1 , , n - 1 , приріст p x t , x t + 1 . x1,,xnt=1,,n1pxt,xt+1
Дзен

Четвертий рядок нормалізує кожен рядок матриці . (pij)
Дзен

Оголений з моєю повільністю тут. Я ціную переклад коду MATLAB, хоча я все ще не бачу, що він намагається зробити у першому forциклі. 3-й рядок з початкового коду підраховує кількість разів переходить зі стану x i в стан x j ? Якби ви могли сказати це словами, я дуже цінував би це. Ураxxixj
HCAI

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 (розміщується як редагування замість коментаря, оскільки йому / їй не вистачає репутації): Як я можу примусити перехідMatrix результату markovchainFit до data.frame?
chl

Ви можете конвертувати в з допомогою сек ( м з Й , « д т . е г м е » )data.frameas(mcX,"data.frame")
Giorgio Spedicato

@GiorgioSpedicato Ви можете прокоментувати, як поводитися з послідовностями неоднакової довжини (я не можу об'єднати), будь ласка, у своєму пакеті?
HCAI

@HCAI, дивіться сторінку поточної віньєтки 35-36
Джорджіо Шпедікато

@GiorgioSpedicato дякую вам за посилання cran.r-project.org/web/packages/markovchain/vignettes/… . У мене ще є n матриць переходу, по одній для кожної послідовності. Що я хочу, - це одне загальне, яке враховує всі спостереження щодо послідовності. Щось мені не вистачає?
HCAI

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.