HMM 前向後向算法(轉)

最近研究NLP頗感興趣,但因爲比較懶,因此只好找來網上別人的比較好的博客,備份一下,也方便本身之後方便查找(其實,通常是不會再回過頭來看的,嘿嘿 -_-!!)html

代碼本身從新寫了一遍,因此就不把原文代碼貼過來了。算法

1. 前向算法(摘自http://www.cnblogs.com/kaituorensheng/archive/2012/12/01/2797230.html)

隱馬模型的評估問題即,在已知一個觀察序列O=O1O2...OT,和模型μ=(A,B,π}的條件下,觀察序列O的機率,即P(O|μ}3d

                   

      若是窮盡全部的狀態組合,即S1S1...S1, S1S1...S2, S1S1...S3, ..., S3S3...S3。這樣的話t1時刻有N個狀態,t2時刻有N個狀態...tT時刻有N個狀態,這樣的話一共有N*N*...*N= NT種組合,時間複雜度爲O(NT),計算時,就會出現「指數爆炸」,當T很大時,簡直沒法計算這個值。爲解決這一問題,Baum提出了前向算法。htm

      概括過程blog

      首先引入前向變量αt(i):在時間t時刻,HMM輸出序列爲O1O2...OT,在第t時刻位於狀態si的機率。事件

      當T=1時,輸出序列爲O1,此時計算機率爲P(O1|μ):假設有三個狀態(以下圖)一、二、3,輸出序列爲O1,有三種可能一是狀態1發出,二是從狀態2發出,三是從狀態3發出。另外從狀態1發出觀察值O1得機率爲b1(O1),從狀態2發出觀察值O1得機率爲b2(O1),從狀態3發出觀察值O1得機率爲b3(O1)。所以能夠算出博客

     P(O1|μ)= π1*b1(O1)+π2*b2(O1) +  π3*b3(O1)= α1(1) + α1(2) + α1(3)it

                                     

      當T=2時,輸出序列爲O1O2,此時計算機率爲P(O1O2|μ):假設有三個狀態(以下圖)一、二、3,輸出序列爲O1,有三種可能一是狀態1發出,二是從狀態2發出,三是從狀態3發出。另外從狀態1發出觀察值O2得機率爲b1(O2),從狀態2發出觀察值O2得機率爲b2(O2),從狀態3發出觀察值O2得機率爲b3(O2)。變量

      要是從狀態1發出觀察值O2,可能從第一時刻的一、2或3狀態裝換過來,要是從狀態1轉換過來,機率爲α1(1)*a11*b1(O2),要是從狀態2轉換過來,機率爲α1(2)*a21*b1(O2),要是從狀態3轉換過來,機率爲α1(3)*a31*b1(O2),所以程序

     P(O1O2,q2=s1|μ)= α1(1)*a11*b1(O2)  + α1(2)*a21*b1(O2) + α1(3)*a31*b1(O2)=α2(1)

                                     

      同理:P(O1O2,q2=s1|μ)= α1(1)*a12*b2(O2)  + α1(2)*a22*b2(O2) + α1(3)*a32*b2(O2)=α2(2)

               P(O1O2,q2=s1|μ)= α1(1)*a13*b1(O2)  + α1(2)*a23*b3(O2) + α1(3)*a33*b3(O2)=α2(3)

     因此:P(O1O2|μ)=P(O1O2,q2=s1|μ)+ P(O1O2,q2=s1|μ)+ P(O1O2,q2=s1|μ)

                             =α2(1) + α2(2) + α2(3)

      以此類推。。。

      前向算法

       step1 初始化:α1(i) = πi*bi(O1), 1≤i≤N

       step2 概括計算:

                           

       step3 終結:

                      P(O|μ)=

      時間複雜度

      計算某時刻的某個狀態的前向變量須要看前一時刻的N個狀態,此時時間複雜度爲O(N),每一個時刻有N個狀態,此時時間複雜度爲N*O(N)=O(N2),又有T個時刻,因此時間複雜度爲T*O(N2)=O(N2T)。

      程序例證

       

        前向算法計算P(O|M):

        step1:α1(1) =π1*b1(red)=0.2*0.5=0.1          α1(2)=π2*b2(red)==0.4*0.4= 0.16          α1(3)=π3*b3(red)==0.4*0.7=0.21

        step2:α2(1)=α1(1)*a11*b1(white) + α1(2)*a21*b1(white) + α1(3)*a31*b1(white)

                     ...

        step3:P(O|M) = α3(1)+α3(2)+α3(3)

2. 後向算法(摘自http://www.cnblogs.com/kaituorensheng/archive/2012/12/03/2800489.html)

對於HMM的評估問題,利用動態規劃能夠用前向算法,從前到後算出前向變量;也能夠採用後向算法,從後到前算出後向變量。

先介紹後向變量βt(i):給定模型μ=(A,B,π),而且在時間 時刻t 狀態爲s的前提下,輸出序列爲Ot+1Ot+2...OT的機率,即

                                    βt(i)=P(Ot+1Ot+2...OT|qt=si,μ)

概括過程

    假設仍然有3個狀態

                  

    當t=T時,按照定義:時間t  狀態q輸出爲OT+1......的機率,從T+1開始的輸出是不存在的(由於T時刻是終止終止狀態),即T以後是空,是個必然事件,所以βt(i)=1,1≤1≤N

    當t=T-1時,

                          

                 βT-1(i)=P(OT|qT-1=si,μ) = ai1*b1(OT)*βT(1)  +  ai2*b2(OT)*βT(2)  +  ai3*b3(OT)*βT(3)

      ......

    當t=1時,

       β1(1)=P(O2O3...OT|q2=s1,μ) = a11*b1(O2)*β2(1) + a12*b2(O2)*β2(2) + a13*b3(O2)*β2(3)

       β1(2)=P(O2O3...OT|q2=s1,μ) = a21*b1(O2)*β2(1) + a22*b2(O2)*β2(2) + a23*b3(O2)*β2(3)

       β1(3)=P(O2O3...OT|q2=s1,μ) = a31*b1(O2)*β2(1) + a32*b2(O2)*β2(2) + a33*b3(O2)*β2(3)

       P(O1O2...OT|μ) =    

                             =   

                             =  

後向算法

    step1 初始化:βT(i)=1, 1≤1≤N

    step2 概括計算:

                       1≤t≤T-1, 1≤i≤N

    step3 求終結和:

                   P(O|μ)=  

時間複雜度

    計算某時刻在某個狀態下的後向變量須要看後一時刻的N個狀態,此時時間複雜度爲O(N),每一個時刻有N個狀態,此時時間複雜度爲N*O(N)=O(N2),又有T個時刻,因此時間複雜度爲T*O(N2)=O(N2T)。

程序例證

              

後向算法

    計算P(O|M):

    step1:β4(1) = 1          β4(2) = 1          β4(3) = 1

    step2:β3(1) = β4(1)*a11*b1(white) + β4(2)*a12*b2(white) + β4(3)*a13*b3(white)

                     ...

    step3:P(O|M) = π11(1)*b1(O1) + π21(2)*b2(O1) + π31(3)*b3(O1)

3.前向-後向算法(摘自http://www.cnblogs.com/kaituorensheng/archive/2012/12/05/2803182.html)

從新回顧:

    前向變量αt(i):在時刻t,在已知模型μ=(A,B,π)的條件下,狀態處於si,輸出序列爲O102...Ot,前向變量爲αt(i)

    後向變量βt(i):在時刻t,在已知模型μ=(A,B,π)和狀態處於si的條件下,輸出序列爲Ot+1Ot+2...OT,後向變量爲βt(i)

公式推導:

    P(O,qt=si|μ) = P(O1O2...OT, qt=si|μ)

                         =P(O1O2...Ot, qt=si,Ot+1Ot+2...OT|μ)

                         =P(O1O2...Ot, qt=si|μ) * P(Ot+1Ot+2...OT|O1O2...Ot, qt=si,μ)

                         =P(O1O2...Ot, qt=si|μ) * P(Ot+1Ot+2...OT|qt=si,μ)

                         =αt(i) *  βt(i)

     P(O|μ)=

案例分析:

    

      分析:

        P(q4=s3|O,M) =  P(q4=s3, O|M)/P(O|M)

                            = P(O,q4=s3|M)/P(O|M)

                            = α4(3) *  β4(3)/  

相關文章
相關標籤/搜索