本篇只會介紹程式碼,原理與更多解釋請參考這裡
讓我們一行一行來分析:
首先是宣告各種需要的參數並執行初始化。
我們要計算的終極目標,為了解決underflow而產生的scaled_alpha,
大小是row:狀態數量、column:序列長度的矩陣,簡單來說看成我們介紹alpha時畫的表格就可以了。
但為了後續計算方便我們把alpha的表格翻轉,他現在是直的。
之後要用來計算的scaled_alpha的alpha,因為每次用完就丟掉所以不用跟scaled_alpha一樣弄一個二維矩陣來存。
scaling factor,大小和O的長度一樣,初始值就和公式相同(初始alpha值總和)。
最後用初始值的C初始化scaled_alpha;P是用存scaled_alpha總和的變數。
迴圈長度就是alpha表格大小。套用公式先計算alpah再算C,求出全部的C後再計算新的scaled_alpha。(@代表矩陣內積)
把剛剛在迴圈裡偷加的P再乘上一個負號就是我們要的答案。
如果是Baum-Welch函式呼叫的就回傳scaled_alpha表格,因為後續計算要用;其他方式呼叫就直接回傳P就好。