Прямой / обратный алгоритмы для простой (не скрытой) цепи Маркова - PullRequest
0 голосов
/ 07 мая 2018

С учетом начальной матрицы перехода

enter image description here

где x - начальный узел, откуда случайный бродяга начинает свое хождение.

Затем мы можем рассчитать количество:

enter image description here

, который представляет ожидаемое число посещений края (i, j) при запуске обхода по x, учитывая, что длина обхода равна L.

Поскольку вычисление вышеуказанного количества занимает очень много времени из-за питания некоторых матриц, например Q ^ (L-1), мне было интересно, существуют ли алгоритмы, аналогичные алгоритмам прямого и обратного хода для НММ, для вычисления этого количества для этой простой (видимой) цепи Маркова.

1 Ответ

0 голосов
/ 21 июня 2018

Есть несколько хитростей с марковскими моделями для подобных вопросов.

В вашем случае я предполагаю, что вы хотите ожидаемое количество посещений определенного ребра i, j при

  1. матрица вероятностей перехода P ,
  2. все цепочки начинаются с x и
  3. все цепи имеют длину L

Я буду игнорировать любую специальную форму, такую ​​как ваша P, которая может еще больше улучшить скорость. Общая идея (которая может быть распространена на другие вопросы о системе Маркова) заключается в следующем:

Сначала мы понимаем, что если бы мы знали фактическое число посещений состояния, из которого начинается ребро, мы можем использовать матрицу перехода P , чтобы вывести фактические значения определенного ребра.

Пример: скажем, в цепочках длиной 50 мы знаем, что в среднем 10 раз мы находимся в состоянии 1. А в P шанс выпрыгнуть из 1 -> 2 составляет 50%. Затем в цепочках длиной 50 + 1 мы находим, что 10 * 50% = 5 всех ребер в среднем равны 1 -> 2. (Обратите внимание на разницу между государственными посещениями и посещениями ребер!)

К счастью, ожидание нахождения в состоянии можно записать в виде геометрического ряда матрицы перехода. Вы можете использовать обычный трюк для геометрического ряда, если знаменатель можно перевернуть, что, к сожалению, не относится к матрице переходов. По крайней мере, не тривиально, но это можно решить.

Позвольте мне записать число посещений штатов с использованием LaTeX

E_c{x_0,L} = \sum_{i=0}^{L-1} P^i x_0 = (\sum_{i=0}^{L-1} P^i) x_0

где x_0 - вектор, дающий начальное распределение в вашем случае ноль везде, но одно состояние по вашему выбору.

Обратите внимание, что сумма перед x_0 является матрицей, которая содержит все подсчеты состояний для всех возможных начальных состояний. Теперь для вычисления этой матрицы. Используя геометрический ряд, получаем

\sum_{i=0}^{L-1} P^i = \frac{P^L - Id}{P - Id}

с Id единичной матрицей. Знаменатель единственного числа, поэтому у нас есть проблема. К счастью, числитель имеет ту же проблему , поэтому мы можем это исправить. Использовать разложение по собственным значениям и переписать P, используя матрицы левого и правого собственных векторов и диагональную матрицу собственных значений evD

P = evR evD evL

\sum_{i=0}^{L-1} P^i = \sum_{i=0}^{L-1} (evR evD evL)^i 
                     = evR (\sum_{i=0}^{L-1} evD^i ) evL

Теперь у нас остались простые геометрические ряды для каждого собственного значения. Одно собственное значение равно 1, и это вызывает проблемы. Но в этом случае мы просто подводим итоги. От 0 до L-1 сумма 1 равна просто L. Другие геометрические ряды четко определены.

Pro: теперь вы можете мгновенно вычислить ребра для любого выбора x_0 или L.

Con: Вы всегда должны делать собственное разложение, которое является проблемой, если у вас большие матрицы.

* * Пример тысяча сорок-девять:

Простая четная симметричная матрица

P = {{0.8,   0.15, 0.05}, 
     {0.075, 0.85, 0.075}, 
     {0.05,  0.15, 0.8}}

мы выбрали L = 51 (50 переходов) и x_0 = {1, 0, 0}

evD = {{1., 0., 0.}, {0., 0.75, 0.}, {0., 0., 0.7}}
evR = {{-0.612372, -0.707107, 0.612372}, {-0.612372, 0, -0.612372}, {-0.612372, 0.707107, 0.612372}}
evL = {{-0.408248, -0.816497, -0.408248}, {-0.707107, 0, 0.707107}, {0.408248, -0.816497, 0.408248}}

GeometricSeries(evD,50) = {{50., 0., 0.}, {0., 4., 0.}, {0., 0., 3.33333}}

E_c(x_0 = 1) = evR GeometricSeries(evD,50) evL {1, 0, 0}
             = {15.3333, 11.6667, 11.3333}

Для перехода 1 -> 2 (15%) получаем 15,3333 * 15% = 2,3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...