標籤:style blog http color art for
隱馬爾科夫模型中有三個問題:
1) 估計問題:給定一個觀察序列O=O1O2...OT和模型u = (A, B, π), 如何快速地計算出給定模型u情況下,觀察序列O的機率,即P(O|u)
2) 序列問題: 給定觀察序列O=O1O2...OT和模型u = (A, B, π), 如何快速有效地選擇在一定意義下“最優”的狀態序列Q=q1q2...qT,使得該狀態序列“最好地解釋”觀察序列?
3) 訓練問題或參數估計:給定一個觀察序列O=O1O2...OT,如何根據最大似然估計來求模型的參數值?即如何調節模型u=(A, B, π)的參數,使得P(O|u)最大?
問題1是一個解碼問題,前向演算法可以解決該問題(forward procedure),也是動態規劃法的一種應用。
關於前向演算法的基礎知識可以看下面的文章
http://www.cnblogs.com/tornadomeet/archive/2012/03/24/2415583.html
最後是ruby代碼
class FowardAlgorithm def initialize(pi, trans_pro, emit_pro) @pi = pi @trans_pro = trans_pro @emit_pro = emit_pro end def alpha1(state, ob) @pi[state] * @emit_pro[state][ob] end def alpha(t, state) # t starts from 0, states starts from 9 if t.equal? 0 alpha1(state, @ob[0]) else sum = ([email protected]_pro.size).inject(0.0) { |sum, i| sum += alpha(t-1, i) * @trans_pro[i][state] } sum * @emit_pro[state][@ob[t]] end end def p_rerial_n ob n = ob.size n -= 1 @ob = ob # time & states res = 0.0 [email protected]_pro.size.times { |i| #print "time #{n}, state #{i}" tmp = alpha n, i res += tmp } res endenddef test pi = [0.2, 0.4, 0.4] trans_pro = [ [0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5] ] emit_pro = [ [0.5, 0.5], [0.4, 0.6], [0.7, 0.3] ] f = FowardAlgorithm.new pi, trans_pro, emit_pro puts f.p_rerial_n([0, 1, 0, 1])endif $PROGRAM_NAME == __FILE__ testend