[英]Gamma in the Baum Welch algorithm and float precision
我目前正在嘗試用 C 實現 Baum Welch 算法,但我遇到了以下問題:伽馬函數:
gamma(i,t) = alpha(i,t) * beta(i,t) / sum over `i` of(alpha(i,t) * beta(i,t))
不幸的是,對於足夠大的觀察集,隨着t
增加,alpha 迅速下降到 0,隨着t
減少,beta 迅速下降到 0,這意味着,由於四舍五入,永遠不會有 alpha 和 beta 都非零的地方,這使事情變得相當有問題。
有沒有辦法解決這個問題,還是我應該嘗試提高值的精度? 我擔心如果我嘗試這種方法,問題可能會再次出現,因為每次觀察的 alpha 和 beta 下降大約一個數量級。
您應該在對數空間中進行以下計算,並且通常應進行概率模型的所有計算:
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
是此處描述的函數 。 在計算結束時,可以根據需要使用exp
轉換為概率(通常只需要顯示概率,但是甚至最好有日志)。
對數的底數並不重要,只要您在各處使用相同的底數即可。 我更喜歡自然對數,因為log
相比,節省了打字log2
:)
我認為您應該對使alpha
和beta
顯着小於1的每個觀察結果執行縮放程序。 它將系數乘以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的很好的教程可以很好地解釋此過程: 有關隱藏的markov模型和語音識別中所選應用程序的教程(rabiner 1989)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.