Baum Welch算法中的Gamma和浮点精度

时间:2014-04-23 12:36:17

标签: c hidden-markov-models rounding-error

我目前正在尝试在C中实现Baum Welch算法,但我遇到了以下问题:gamma函数:

gamma(i,t) = alpha(i,t) * beta(i,t) / sum over `i` of(alpha(i,t) * beta(i,t))

不幸的是,对于足够大的观察集,随着t的增加,alpha迅速下降到0,并且当t减少时,β迅速下降到0,这意味着,由于向下舍入,所以从未有过alpha和beta都不为零的点,这会使事情变得有问题。

有没有解决这个问题的方法,还是我应该尝试提高值的精确度?我担心如果我尝试这种方法,问题可能会再次出现,因为每次观察的α和β下降约一个数量级。

2 个答案:

答案 0 :(得分:5)

你应该在日志空间中进行这些计算,并且通常所有计算概率模型:

lg_gamma(i, t) = (lg_alpha(i, t) + lg_beta(i, t)
                  - logsumexp over i of (lg_alpha(i, t) + lg_beta(i, t)))

其中lg_gamma(i, t)代表gamma(i, t)等的对数,而logsumexp代表the function described here。在计算结束时,如果需要,您可以使用exp转换为概率(通常只需要显示概率,但即使是日志也可能更好)。

对数的基数并不重要,只要你在任何地方都使用相同的基数。我更喜欢自然对数,因为loglog2相比可以节省打字:)

答案 1 :(得分:-1)

我认为你应该为每个观察做一个缩放程序,使alphabeta明显少于一个。它会将系数乘以alphabeta,使它们保持在可比范围内。
你应该将一个系数乘以一个系数,比如说c到每个将它保持在可比边界的alpha变量,这个c应该是这样的形式:

c(t) = 1 / sum(alpha(t,i)) , i=1... number of states , t=time step ( observation)

请注意,在每个时间步,您将计算c(t)将乘以该时间步上所有州的所有alpha。接下来为beta做同样的程序。

有一个关于HMM的好教程可以很好地解释这个过程:a tutorial on hidden markov models and selected applications in speech recognition (rabiner 1989)