Оценка вероятностей марковских переходов по данным последовательности


16

У меня есть полный набор последовательностей (432 наблюдения, если быть точным) из 4 состояний : например,AD

Y=(ACDDBACBAACABCADABA)

РЕДАКТИРОВАТЬ : Последовательности наблюдения имеют неодинаковую длину! Это что-то меняет?

Есть ли способ расчета переходной матрицы в Matlab или R или аналогичных? Я думаю, что пакет HMM может помочь. Есть предположения?

Pij(Yt=j|Yt1=i)

Например: оценка вероятностей цепей Маркова


3
У вас есть 4 состояния: S={1:=A,2:=B,3:=C,4:=D} . Пусть nij будет числом раз, когда цепочка переходила из состояния i в состояние j , для ij,=1,2,3,4 . Вычислите nij из вашей выборки и оцените матрицу переходов (pij) по максимальной вероятности, используя оценки p^ij=nij/j=14nij .
Дзен

Эти примечания выводят оценки MLE: stat.cmu.edu/~cshalizi/462/lectures/06/markov-mle.pdf
Zen,

2
Аналогичный вопрос: stats.stackexchange.com/questions/26722/…
B_Miner

@B_Miner не могли бы вы написать свой код в форме псевдокода для меня? Или объясните это в упрощенном виде ... Однако я вижу, что это работает в моей консоли R.
HCAI

У меня есть вопрос: я понимаю вашу реализацию, и она мне нравится, но мне было интересно, почему я не могу просто использовать функцию Matlab hmmestimate для вычисления T-матрицы? Что-то вроде: states = [1,2,3,4] [T, E] = hmmestimate (x, states); где T - переходная матрица, в которой я заинтересован. Я новичок в цепях Маркова и 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

Выглядит отлично! Я не уверен, что 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 (опубликованный в виде редактирования, а не комментария, поскольку у него / нее отсутствует репутация): как я могу принудительно преобразовать значение переходаMatrix результата markovchainFit в data.frame?
ЧЛ

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

@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.