我目前正在尝试用 python 实现维特比算法,更具体地说是在线类(class)中提供的版本。
就目前情况而言,该算法是这样表示的: 给定一个带有 K 个标记的句子,我们必须生成 K 个标记。
我们假设标签 K-1 = 标签 K-2 = '*',那么对于 k 从 0 到 K, 我们为 token 设置标签如下: 标签(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 参数的 max 可以通过标签的一次迭代来计算(因为我们无法提出 2 个不同的标签,所以我们基本上必须找到 q * e 乘积最大的标签 T,然后返回)。这节省了大量时间,因为我们在大 O 表示法中几乎处于线性时间,而不是指数复杂度,如果我们迭代所有可能的单词/标签组合,我们就会得到指数复杂度。
我是否正确理解了算法的核心,还是遗漏了一些东西?
提前致谢
最佳答案
since we can't come up with 2 different tags, we basically have to find the tag T for which the q * e product is maximal, and return that
是的,听起来不错。 q
是三元组(转移)概率,e
称为发射概率。正如你所说每个阶段的不同路径之间是不变的,因此最大值仅取决于其他两个。
每个标记序列应在位置 -2
和 -1
处以两个星号开头。所以第一个假设是正确的:
如果我们假设根据我们刚刚所说的开头星号,位置 k
处的最后两个标签是 u
和 v
的最大概率,基本情况是
.
不过,在一般情况下您有两个错误。发射概率是有条件的。同样在卦象中,重复两次,给出的公式不正确:
关于machine-learning - 尝试更好地理解 VITERBI 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33263758/