Sle*_*eah 5 c rounding-error hidden-markov-models
我目前正在尝试用C实现Baum Welch算法,但我遇到了以下问题:gamma函数:
gamma(i,t) = alpha(i,t) * beta(i,t) / sum over `i` of(alpha(i,t) * beta(i,t))
Run Code Online (Sandbox Code Playgroud)
不幸的是,对于足够大的观察集,α随着t增加迅速下降到0 ,并且β随着下降迅速下降到0 t,这意味着,由于向下舍入,从来没有α和β都非零的点,这使得事情很有问题.
有没有解决这个问题的方法,还是我应该尝试提高值的精确度?我担心如果我尝试这种方法,问题可能会再次出现,因为每次观察的α和β下降约一个数量级.
您应该在日志空间中进行这些计算,通常是概率模型的所有计算:
lg_gamma(i, t) = (lg_alpha(i, t) + lg_beta(i, t)
- logsumexp over i of (lg_alpha(i, t) + lg_beta(i, t)))
Run Code Online (Sandbox Code Playgroud)
其中lg_gamma(i, t)代表对数gamma(i, t)等,并且logsumexp是此处描述的函数.在计算结束时,您可以exp根据需要使用转换为概率(通常仅用于显示概率,但即使是日志也可能更好).
只要在任何地方使用相同的基数,对数的基数并不重要.我更喜欢自然对数,因为log节省打字比较log2:)