我目前正在尝试在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都不为零的点,这会使事情变得有问题。
有没有解决这个问题的方法,还是我应该尝试提高值的精确度?我担心如果我尝试这种方法,问题可能会再次出现,因为每次观察的α和β下降约一个数量级。
答案 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
转换为概率(通常只需要显示概率,但即使是日志也可能更好)。
对数的基数并不重要,只要你在任何地方都使用相同的基数。我更喜欢自然对数,因为log
与log2
相比可以节省打字:)
答案 1 :(得分:-1)
我认为你应该为每个观察做一个缩放程序,使alpha
和beta
明显少于一个。它会将系数乘以alpha
和beta
,使它们保持在可比范围内。
你应该将一个系数乘以一个系数,比如说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)