试图更好地理解 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
的最后两个标签是u
和v
的最大概率,根据我们刚才所说的关于开始的星号,基本情况将是
.
但在一般情况下,您有两个错误。发射概率是有条件的。同样在三元组中, 重复了两次,给出的公式不正确:
【讨论】:
以上是关于试图更好地理解 VITERBI 算法的主要内容,如果未能解决你的问题,请参考以下文章
Forward-backward算法和Viterbi算法有啥区别?
隐马尔可夫(HMM)前/后向算法Viterbi算法 再次总结