试图更好地理解 VITERBI 算法

Posted

技术标签:

【中文标题】试图更好地理解 VITERBI 算法【英文标题】:Trying to understand the VITERBI algorithm a bit better 【发布时间】:2016-01-20 17:06:14 【问题描述】:

我目前正在尝试在 python 中实现 viterbi 算法,更具体地说是在线课程中介绍的版本。

就目前而言,算法是这样呈现的: 给定一个带有 K 个标记的句子,我们必须生成 K 个标签。

我们假设标签 K-1 = 标签 K-2 = '*',那么对于 k 从 0 到 K, 我们为令牌设置标签如下: tag(WORD_k) = argmax(p(k-1, tag_k-2, tag_k-1) * e( word_k, tag_k) * q(tag_k, tag_k-1, tag_k-1))

根据我的理解,这很简单,因为 p 参数已经在每一步中计算出来(我们从 1 开始,我们已经知道 p0),并且 e 和 q 参数的最大值可以通过标签的一次迭代来计算(因为我们不能提出 2 个不同的标签,所以我们基本上必须找到 q * e 乘积最大的标签 T,然后返回它)。这节省了很多时间,因为我们在大 O 表示法中几乎处于线性时间,而不是指数复杂度,如果我们迭代所有可能的单词/标签组合就会得到。

我是否正确理解了算法的核心,还是我遗漏了什么?

提前致谢

【问题讨论】:

【参考方案1】:

因为我们不能想出两个不同的标签,我们基本上必须 找到 q * e 乘积最大的标签 T,并返回它

是的,听起来差不多。 q 是三元组(转换)概率,e 被命名为发射概率。正如你所说的在每个阶段的不同路径之间是不变的,所以最大值只取决于其他两个。

每个标签序列都应该在-2-1 的位置以两个星号开头。所以第一个假设是正确的:

如果我们假设 是位置k 的最后两个标签是uv 的最大概率,根据我们刚才所说的关于开始的星号,基本情况将是

.

但在一般情况下,您有两个错误。发射概率是有条件的。同样在三元组中, 重复了两次,给出的公式不正确:

【讨论】:

以上是关于试图更好地理解 VITERBI 算法的主要内容,如果未能解决你的问题,请参考以下文章

labVIEW viterbi译码看不懂,求大神指教~

Forward-backward算法和Viterbi算法有啥区别?

隐马尔可夫(HMM)前/后向算法Viterbi算法 再次总结

维特比算法(Viterbi)

ML-13-4隐马尔科夫模型HMM--预测问题Viterbi(维特比)算法

维特比算法 Viterbi