Поиск путей top-k viterbi в HMM

Мне нужно написать алгоритм, который найдет пути top-k viterbi в HMM (используя обычный алгоритм viterbi для поиска наилучшего пути).

Мне кажется, мне, вероятно, нужно сохранить список V_t, N размера k для каждого состояния N, который содержит пути top-K, которые заканчиваются в состоянии N, но я не уверен, как отслеживать этот список. есть идеи? Благодаря

Ответ 1

Мы можем решить это с некоторой осторожностью. Это проще всего увидеть, посмотрев на решетчатую структуру хмм:

Simple Trellis Image

В этом примере скрытые состояния - 00, 01, 10, 11, обозначают набор этих четырех как S. Наблюдения не показаны, но предположим, что они равны 0,1.

Предположим, что у нас есть правильная матрица перехода:

transition[4][4]

Вероятности выбросов:

emissions[4][2]

И начальные вероятности:

p[2]

Таким образом, каждый столбец представляет собой скрытые состояния, а целью Витерби является вычисление наиболее вероятной скрытой последовательности состояний с учетом наблюдений. Пусть теперь альфа (i, t) = наибольшая вероятность того, что последовательность скрытых состояний находится в состоянии я (i является одним из 00, 01, 10, 11), в момент времени t, где наблюдение в момент времени t является o_t (o_t равно единице 0, 1). Пусть первое наблюдение обозначим o_1. Его можно вычислить эффективно, как:

alpha(i, 1) = p[i] * emissions[i][o_1]
alpha(i, t) = emissions[i][o_t] * max_{k in states} (alpha(k, t-1) * transition[k][i]) 

Чтобы найти лучший путь, мы сохраняем указатели назад на шаге alpha (i, t) до состояния, которое максимизирует максимальную функцию выше. Наконец, мы просто изучаем все альфа (i, T) и для я в состояниях и находим, какой из них самый большой, а затем следуем за ним, чтобы получить наиболее вероятную последовательность состояний.

Теперь нам нужно расширить это, чтобы хранить верхние k-пути. В настоящее время в каждой альфа (i, t) мы сохраняем только одного родителя. Однако предположим, что мы сохранили верхние k предшественников. Таким образом, каждая альфа (i, t) соответствует не только наиболее вероятному значению и node, из которого он перешел, но и списку верхних k-узлов, из которых он мог бы перейти, и их значения в отсортированном порядке.

Это легко сделать, поскольку вместо того, чтобы делать max и принимать только один предыдущий node, мы берем верхние k предыдущих узлов и сохраняем их. Теперь для базового случая нет предшествующего node, поэтому alpha (i, 1) все еще остается только одним значением. Когда мы приходим к произвольному столбцу (например, t) и хотим найти пути top-k, заканчивающиеся на node (i) в этом столбце, мы должны найти верхние k предшественников, и из них следует выбрать верхние пути их.

Это как если бы у нас была следующая проблема: матрица m с размером 4 на k, где строка представляет предыдущее состояние, а m [состояние] представляет собой верхние k вероятности для заканчивающихся там путей. Таким образом, каждая строка из m сортируется по наименьшей по величине, теперь проблема становится:

Best_K_Values(t, i) = Top K over all i,preceding_state,k (emissions[i][o_t] * m[preceding_state][k] * transition[preceding_state][i])

Теперь это выглядит сложным, но для его понимания требуется некоторое время, мы можем решить вершину k из задачи сортированной матрицы, используя кучу в O (4 log k) или O (numStates log k) вообще.

Посмотрите это небольшое изменение наименьший элемент Kth в отсортированной матрице, просто обратите внимание, что в нашем случае столбцы не сортируются, но идея там все еще применяется.

Если вы все еще читаете, то обратите внимание, что общая сложность этого метода - O ((numStates log k) * numStates * t) = O (numStates ^ 2 * t * log k) (я считаю, что правильная сложность).

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