在HMM中找到top-k维特比路径

时间:2012-12-07 17:47:23

标签: algorithm hidden-markov-models viterbi

我需要编写一个算法,在HMM中找到top-k维特比路径(使用常规维特比算法找到最佳路径)。

我想我可能需要为包含以状态N结尾的前K路径的每个状态N保存大小为k的列表V_t,N,但我不太确定如何跟踪该列表。 有任何想法吗?感谢

2 个答案:

答案 0 :(得分:17)

我们可以小心解决这个问题。通过观察hmm的格子结构最容易看出:

Simple Trellis Image

在这个例子中,隐藏状态是00,01,10,11,表示这四个的集合为S.观察结果没有显示,但假设它们是0,1。

假设我们有正确的Transition Matrix:

transition[4][4]

排放概率:

emissions[4][2]

初始概率:

p[2]

因此,每列都代表隐藏状态,维特比的目标是计算观察时最可能隐藏的状态序列。现在让alpha(i,t)=隐藏状态序列处于状态i(i是00,01,10,11之一)的最大概率,在时间t,在时间t观察时间为o_t(o_t为1) 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)步骤中将指针向后保持到最大化上述最大函数的状态。最后,我们只检查状态中的所有alpha(i,T)和i,并找出哪一个最大,然后再跟回以获得最可能的状态序列。

现在我们需要扩展它以存储顶部k路径。目前在每个alpha(i,t),我们只存储一个父。但是假设我们存储了前k个前辈。因此,每个alpha(i,t)不仅对应于最可能的值和它从中转换的节点,而且对应于它可以从其转换的前k个节点的列表以及它们的值按排序顺序。

这很容易做到,因为它不是做max,而只取一个前面的节点,我们采用前面的前k个节点并存储它们。现在对于基本情况,没有前面的节点,因此alpha(i,1)仍然只是一个值。当我们到达任意列(比如说t)并且想要找到在该列中的节点(i)处结束的前k个路径时,我们必须找到前k个前驱者和来自它们的顶部路径。

这就好像我们有以下问题,矩阵m,大小为4乘k,其中一行表示先前状态,m [state]表示结束那里的路径的前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])

现在这看起来令人生畏但需要一些时间来理解它,我们可以使用O(4 log k)或O(numStates log k)中的堆来解决排序矩阵问题中的前k个。

请参阅此轻微变化Kth smallest element in sorted matrix,请注意,在我们的情况下,列未进行排序,但其中的想法仍然适用。

如果您还在阅读,请注意此方法的总体复杂性为O((numStates log k)* numStates * t)= O(numStates ^ 2 * t * log k)(我认为这是正确的复杂性)

这可能很难理解,但如果您有任何问题或者我做错了,请告诉我。

答案 1 :(得分:3)

实际上有大量关于此的文献。这需要一些挖掘,但我发现了这一点。

列出应用程序的维特比解码算法

http://www.ensc.sfu.ca/people/faculty/cavers/ENSC805/readings/42comm02-seshadri.pdf