Закончив выполнять упражнения, которые я покажу в этой статье, я понял, что они очень помогли мне понять скрытые марковские модели (СММ). Вот почему я подумал, что эта статья может быть полезной для тех, кто пытается понять основные концепции HMM на практике. Информация будет подаваться в двух вариантах — бумажном и кодовом.

Предпосылки для части кодирования:

*Если вы студент, есть большая вероятность, что вы можете получить Matlab со студенческой лицензией, или, возможно, ваш университет предоставляет лицензии Matlab. Если нет, то на момент написания есть 30-дневная тестовая версия, и вы можете использовать ее, чтобы опробовать часть кодирования.

Итак, всякий раз, когда я начинаю изучать что-то новое, мой основной метод — создать базовую основу, которую я полностью понимаю, а затем начать строить на ее основе, чтобы понять более сложные концепции.

Если вы не уверены, что у вас есть эта основа в отношении HMM, я бы порекомендовал пройти серию YouTube mathematicalmonk по HMM. Это намного лучше, чем любое резюме, которое я мог бы написать здесь. Теперь, предполагая, что основные идеи HMM вам знакомы, давайте перейдем к первой проблеме, которая, надеюсь, поможет вам лучше понять HMM.

ХММ по старинке (бумажная часть)

Рассмотрим HMM со следующими свойствами:

  • Скрытый набор состояний Q= {1,2,3}
  • Набор наблюдаемых состояний V= {a, b}
  • Параметр λ = (π, A, B)

где матрицы A(матрица перехода), B(матрица эмиссии), π(начальное распределение) определяются следующим образом:

Нас интересует небольшой временной шаг T = 3 с наблюдаемой последовательностью O = (a, b, a).

Учитывая эту информацию, нам нужно:

  1. Используйте алгоритм Forward для вычисления P(O|λ). Итак, какова вероятность того, что такая последовательность «a → b → a» действительно встречается?
  2. Найдите оптимальную последовательность скрытых состояний I* = (i₁*, i₂*, i₃*). Имеется в виду, какие 3 скрытых состояния с наибольшей вероятностью находятся за последовательностью «a → b → a»?

Решение части 1:

  1. Подход здесь состоит в том, чтобы идти шаг за шагом и вычислять вероятность наблюдения текущего состояния с учетом ранее наблюдаемых состояний на каждом временном шаге. Итак, для первого состояния это будет означать:
  • (Вероятность начального распределения) x (вероятность наблюдения состояния "a" с учетом предыдущих состояний) = P(состояние 0) x P(a |состояние ноль).

Продолжая, мы переходим ко второму состоянию, которое соответствует определению алгоритма Forward. Однако, в отличие от расчета для первого состояния, здесь мы должны учитывать результат предыдущего состояния (первое состояние)и включить его в расчеты. В результате получается сумма произведений вероятностей наблюдения предыдущего состояния (α₁ из расчета на верхнем рисунке), умноженных на вероятности текущего состояния с учетом предыдущего те. Если вы запутались в этом объяснении (я старался изо всех сил, но я бы не стал вас винить), просто сравните векторы в формуле со столбцами матрицы B и строками матрицы A. и вы поймете, что именно происходит.

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

Мы почти закончили. Мы прошли одно за другим каждое наблюдаемое состояние за 3 шага, и теперь есть этот вектор, который мы вычислили после применения алгоритма Forward 3 раза. Но что это на самом деле?

Это представление вероятностей наблюдения последовательности «a → b → a» и попадания в:

  • Скрытое состояние 1 с вероятностью 4,187%
  • Скрытое состояние 2 с шансом 3,5512%
  • Скрытое состояние 3 с шансом 5,2836%

Теперь, если вы просуммируете все три процента, вы получите общую вероятность фактического наблюдения «a → b → a», независимо от того, в каком скрытом состоянии вы окажетесь, потому что пока это не представляет интереса.

Вот и все, вероятность фактического наблюдения O = (a, b, a) составляет примерно 13%.

Надеюсь, эта статья была краткой и понятной, но больше всего я надеюсь, что она была полезной. Я позабочусь о том, чтобы решение второй части появилось в сети в течение следующих нескольких дней, и после этого я напишу последнюю статью, в которой обсуждается задача HMM, решенная с помощью Matlab, и его замечательные возможности.

Комментарии, исправления и другие замечания всегда приветствуются.

Источники:
Миниатюра изображения: https://devopedia.org/images/article/214/3976.1567701977.png