隱馬爾可夫(HMM)、前/後向算法、Viterbi算法

轉自:https://www.cnblogs.com/sddai/p/8475424.html
HMM一直想徹底弄明白,這篇文章較爲通俗易懂,留下來多看幾遍,其中有我認爲公式錯誤的,進行了相應的修改

HMM的模型

在這裏插入圖片描述

圖1

如上圖所示,白色那一行描述由一個隱藏的馬爾科夫鏈生成不可觀測的狀態隨機序列,藍紫色那一行是各個狀態生成可觀測的隨機序列

話說,上面也是個貝葉斯網絡,而貝葉斯網絡中有這麼一種,如下圖:
在這裏插入圖片描述

代表:c確定時a和b獨立。(c爲實心圓代表:c已經被確定)

這時,如果把z1看成a,x1看成b,z2看成c的話,則因爲第一個圖的z1是不可觀測的(所以z1是空心圓),也就是沒確定,則x1和z2就一定有聯繫。

進一步,如果把z2、x2合在一起看成c的話,則x1和z2、x2就一定有聯繫,則x1和x2有聯繫(不獨立)。

推廣之後:x2和x3不獨立,x1和x3也不獨立,於是xn們互相不獨立。

PS:
LDA假定文章中的詞與詞之間互相獨立,而HMM中是所有的觀測互相均不獨立。
所以,對於一篇Machine Learn的文章,LDA會吧“機器”和“學習”分成兩個詞,而HMM會將其視爲一個詞。

HMM的確定

初始概率分佈

z1可能是狀態1,狀態2 … 狀態n,於是z1就有個N點分佈:

Z1 狀態1 狀態2 狀態n
概率 P1 P2 Pn
即:Z1對應個n維的向量。
上面這個n維的向量就是初始概率分佈,記做π。

狀態轉移矩陣

但Z2就不能簡單的“同上”完事了,因爲Z2和Z1不獨立,所以Z2是狀態1的概率有:Z1是狀態1時Z2是狀態1,Z1是狀態2時Z2是狀態1,…, Z1是狀態n時Z2是狀態1,於是就是下面的表

Z2Z1\frac{Z2}{Z1} 狀態1 狀態2 狀態n
狀態1 P11 P12 P1n
狀態2 P21 P22 P2n
狀態n Pn1 Pn2 Pnn
即:Z1->Z2對應個n*n的矩陣。
同理:Zi -> Zi+1對應個n*n的矩陣。

上面這些nXn的矩陣被稱爲狀態轉移矩陣,用An*n表示。

當然了,真要說的話,Zi -> Zi+1的狀態轉移矩陣一定都不一樣,但在實際應用中一般將這些狀態轉移矩陣定爲同一個,即:只有一個狀態轉移矩陣。

圖1的第一行就搞定了,下面是第二行。

觀測矩陣

如果對於zi有:狀態1, 狀態2, …, 狀態n,那zi的每一個狀態都會從下面的m個觀測中產生一個:觀測1, 觀測2, …, 觀測m,所以有如下矩陣:

XZ\frac{X}{Z} 觀測1 觀測2 觀測m
狀態1 P11 P12 P1m
狀態2 P21 P22 P2m
狀態n Pn1 Pn2 Pnm

這可以用一個n*m的矩陣表示,也就是觀測矩陣,記做BnmB_{n*m}

由於HMM用上面的π,A,B就可以描述了,於是我們就可以說:HMM由初始概率分佈π、狀態轉移概率分佈A以及觀測概率分佈B確定,爲了方便表達,把A, B, π 用 λ 表示,即:
λ = (A, B, π)

例子

假設我們相對如下這行話進行分詞:

       歡迎來到我的博客

再假設我們是這樣分的:找到“終止字”,然後根據終止字來分詞。即:對於這行字,“迎、到、我、的、客”是終止字,於是最終這麼分詞:歡迎/來到/我/的/博客

下面用上面的知識對這個例子建立HMM的A, B, π:

初始概率分佈的確定:

1,對於每個樣本,我們的目標是確定其是不是“終止字”,因此對於每個樣本,其狀態只有n=2個:狀態1 – 是、狀態2 – 不是。

2,因此初始概率分佈π爲:

π = {p1,p2}

P1:整個句子中第一個字是非終止字的概率

P2:整個句子中第一個字是終止字的概率

狀態轉移矩陣的確定:

剛纔已經知道狀態有n=2個,於是狀態轉移矩陣就立馬得出了,即狀態轉移矩陣是個n*n的矩陣,如下:

             A=

             p11:非終止字 -> 非終止字的概率。

             p12:非終止字 -> 終止字的概率。

             p21:終止字 -> 非終止字的概率。

              p22:終止字 -> 終止字的概率。

觀測矩陣的確定:

如果我們的目標文字使用Unicode編碼,那麼上面的任何一個字都是0~65535中的一個數,於是我們的觀測就會有m=65536個,於是觀測矩陣就是個n*m的矩陣,如下:

             B=

             p1,0:Unicode編碼中0對應的漢字是非終止字的概率

             p1,65535:Unicode編碼中65535對應的漢字是非終止字的概率

             p2,0:Unicode編碼中0對應的漢字是終止字的概率

             p2,65535:Unicode編碼中65535對應的漢字是終止字的概率

PS:爲什麼x會有65535個觀測啊?“歡迎來到我的博客”這個明明只有8個字。原因是因爲真正的HMM面臨的情況,即:現有了 Z1=“非終止字”這個狀態,然後根據這個狀態從65535個字中選出x1=“歡”這個字,然後根據狀態轉移矩陣,下一次轉移到了Z2 =“終止字”,然後根據Z2從65535個字中選出了x2=“迎”這個字,這樣,最終生成了這句話。

HMM的兩個基本性質

在這裏插入圖片描述

齊次假設

當前狀態之和上一個狀態有關係,用公式表示的話就是:

P(zt|zt-1,xt-1, zt-2, xt-2, ..., z1, x1)= P(zt | zt-1)

PS:在一開始時說x1和z2、x2不獨立,怎麼在這裏又說x1和x2獨立呢?其實真嚴格追究的話x1和x2的確不互相獨立,因爲x1是被z1生成的,x2是被z2生成的, 但z2的形成受z1影響,所以x1和x2一定也會有聯繫,但是爲了研究和應用的方便,就假設:生成x1的z1和生成x2的z2不獨立,但x1和x2獨立。

觀測獨立性假設

所有的觀測之間是互相獨立的,某個觀測之和生成它的狀態有關係,即:

       P(xt|zt,xt, zt-1, xt-1, zt-2, xt-2,..., z1, x1) = P(xt | zt)

PS:在一開始時說x1和z2、x2不獨立,怎麼在這裏又說x1和x2獨立呢?其實真嚴格追究的話x1和x2的確不互相獨立,因爲x1是被z1生成的,x2是被z2生成的, 但z2的形成受z1影響,所以x1和x2一定也會有聯繫,但是爲了研究和應用的方便,就假設:生成x1的z1和生成x2的z2不獨立,但x1和x2獨立。

HMM的三個問題

現在有幾個問題:

1,知道HMM的參數 λ = (A, B, π) 和觀測序列O = {o1,o2, …, oT} ,如何計算模型 λ 下觀測序列O出現的概率P(O | λ)。

2,HMM的參數如何確定?

比如:對於剛纔的中文分詞的小例子。

初始概率分佈π好確定:是不是終結詞的概率各是0.5。

觀測矩陣B也好確定:1/65535嘛

但狀態轉移矩陣怎麼確定?我怎麼知道下個詞是終結詞的概率是多少?

3,知道HMM的參數 λ = (A, B, π) 和觀測序列O = {o1,o2, …, oT},如何計算給定觀測序列條件概率P(I|O, λ )最大的狀態序列I,即:

對於中文分詞,我想到底如何分的詞。

上面三個問題:

第一個問題被稱爲:概率計算問題。
解決辦法:前向-後向算法(一種動態規劃算法)。

第二個問題被稱爲:學習問題。
解決辦法:如果狀態序列已知,那用最大似然估計就好了,但HMM的狀態序列未知,即含有隱變量,所以要使用Baum-welch算法(其實其本質就是EM算法)。

第三個問題被稱爲:預測問題/解碼問題。
解決辦法:Viterbi算法(一種動態規劃算法)。

概率計算問題

該問題有兩種解決辦法:

1,直接/暴力算法。

2,前向算法/後向算法。

而上面兩個算法中的“暴力方法”是實際應用中絕不會被使用的。

Q:那爲什麼還說這玩意!(踹)

A:理解了直接/暴力算法可以幫助你推導Baum-welch算法。(回踹!)

直接/暴力計算法

問題:已知HMM的參數 λ,和觀測序列O = {o1, o2, …,oT},求P(O|λ)
思想核心:大力出奇跡。
思路:

1,列舉所有可能的長度爲T的狀態序列I = {i1, i2, …, iT};

2,求各個狀態序列I與觀測序列 的聯合概率P(O,I|λ);

3,所有可能的狀態序列求和∑_I P(O,I|λ)得到P(O|λ)。

步驟:

1,最終目標是求O和I同時出現的聯合概率,即:

             P(O,I|λ)= P(O|I, λ)P(I|λ)

那就需要求出P(O|I, λ) 和 P(I|λ)。

2,求P(I|λ) ,即狀態序列I = {i1,i2, …, iT} 的概率:

             2.1,P(I|λ) = P(i1,i2, ..., iT |λ)

                  =P(i1 |λ)P(i2, i3, ..., iT |i1, λ)

                  =P(i1 |λ)P(i2 | i1, λ)P(i3, i4, ..., iT |i1, i2 λ)
                  
                   =P(i1 |λ)P(i2 | i1, λ)P(i3 | i1, i2, λ)P(i4, ..., iT |i1, i2, i3, λ)

					=P(i1 |λ)P(i2 | i1, λ)P(i3 | i2, λ)P(i4, ..., iT |i1, i2, i3, λ)  (因爲 齊次假設)

                  =......

                  =P(i1 |λ)P(i2 | i1, λ)P(i3 | i2, λ)...P(iT | iT-1, λ)

而上面的P(i1 |λ) 是初始爲狀態i1的概率,P(i2 | i1, λ) 是從狀態i1轉移到i2的概率,其他同理,於是分別使用初始概率分佈π 和狀態轉移矩陣A,就得到結果:
在這裏插入圖片描述

PS:上面的ai1i2a_{i1i2}代表A的第i1行第i2列。

3,P(O|I, λ),即對固定的狀態序列I,觀測序列O的概率是:

在這裏插入圖片描述

4,代入第一步求出P(O,I|λ)。
在這裏插入圖片描述

5,對所有可能的狀態序列I求和得到觀測序列O的概率P(O|λ):
在這裏插入圖片描述
注:上式求和範圍(i1,i2,…iT)我覺得表述的不準確,我理解的應該是每個時刻的狀態都取遍狀態集中所有的狀態。
時間複雜度:
每個時刻有n個狀態,一共有t個時刻,而根據上面的第5步可以知道每個時刻需要乘2T-1次,所以時間複雜度是:O((2T1)nT)O((2T-1)n^{T})

前向算法/後向算法

前向概率-後向概率

如下圖所示:
在這裏插入圖片描述
第一行是觀測不到的狀態序列,第二行是可以觀測到的觀測序列。

前向概率的定義是:當第t個時刻的狀態爲i時,前面的時刻分別觀測到y1,y2, …, yt的概率,即:
在這裏插入圖片描述
後向概率的定義是:當第t個時刻的狀態爲i時,後面的時刻分別觀測到yt+1,yt+2, …, yT的概率,即:
在這裏插入圖片描述

前向算法

如果令前向概率中的t=T,即:

αi(T)=p(y1,y2,...,yT,qT=iλ)α_i(T) = p(y1,y2, ..., yT, qT = i | λ)

那這就意味着,最後一個時刻位於第i號狀態時,觀測到y1, y2, …, yT的概率,這不就是“直接/暴力計算法”中第4步求出來的P(O,I|λ) 嘛。

因此,如果對 αi(T)α_i(T) 的i求和,即:

α1(T)+α2(T)+...+αn(T)α_{1}(T) +α_{2}(T) + ...+ α_{n}(T) 式1

那就是觀測序列O的概率P(O|λ)。

那麼如何算α1(T)+α2(T)+...+αn(T)α_{1}(T) +α_{2}(T) + ...+ α_{n}(T)?

這樣想:

嗯…如果能算出第T-1時刻的前向概率,即α1(T1)+α2(T1)+...+αn(T1)α_{1}(T-1) +α_{2}(T-1) + ... + α_{n}(T-1) 的話,那就能算出式1了(HMM的參數知道了,根據參數不就得了)。

進一步,如果能算出T-2時刻的前向概率,那就能得出T-1時刻的,進而就得出時刻T的了。

按照這個思路:啊!我只要算出1時刻的前向概率不就能算出結果了!

剛纔得到了有趣的結果,即:我求出第一個1時刻的前向概率 αi(1)α_{i}(1) 後就等於求出最終結果了,那 αi(1)α_i(1) 是啥?

不就是第一個時刻狀態爲第i號狀態時觀測到y1的概率嗎,即:

αi(1)=P(y1,q1=iλ)α_{i}(1) = P(y1,q1=i | λ)

而第一個時刻狀態爲第i號狀態的概率是πi,在第i號狀態時得到y1這個觀測的概率是Biy1,於是:

αi(1)=πiBiy1α_i(1) =π_{i}* B_{iy1}

PS:因爲不知道當前是幾號狀態,所以爲了以後的步驟,這裏需要將所有的狀態都算出來,即:計算出所有的 α1(1) ~ αi(1)

好了,第一個時刻已經求出來了,我們就向後推。

假設現在到第t個時刻了,而第t個時刻的狀態是狀態j,那我想求時刻t+1狀態爲i的前向概率怎麼求,這樣求:

時刻t+1的前向概率的 αi(t+1) 的求法就是:t時刻的狀態轉移到t+1時刻的狀態的概率對所有狀態求和 * t時刻的狀態得到觀測的概率,換句話說就是:t時刻的前向概率對所有的狀態求和 * t時刻的狀態得到觀測的概率。

即:

ai(t+1)=(jaj(t)aji)biy(t+1)a_{i}(t+1) = (∑_j a_{j}(t)a_{ji})b_{iy(t+1)}

解釋一下:

首先,時刻t時狀態爲j的前向概率是aj(t)a_{j}(t)

現在時刻t狀態爲j的概率知道了,那乘上狀態j轉移到狀態i的轉移概率就是時刻t+1時狀態爲i的概率,即 aj(t)ajia_{j}(t)a_{ji}

但狀態是不可觀測的啊,所有我們要計算時刻t時所有狀態的情況,於是要對j求和,即:jaj(t)aji∑_j a_{j}(t) a_{ji},這纔是t時刻的狀態轉移到t+1時刻狀態的總概率。

但這樣還沒完,因爲還要由狀態得到觀測,所以還要在乘上狀態i得到觀測yt+1y_{t+1}的概率,於是就是上面的式子了。

現在ai(t+1)a_{i}(t+1) 知道怎麼求了,那不就是所有的的前向概率都知道怎麼求了,於是利用剛纔的結論:P(O|λ) = α1(T) +α2(T) + … + αn(T),不就求出觀測序列O的概率P(O|λ)了,即:

P(Oλ)=iαi(T) P(O|λ) =∑_i α_{i}(T)

OK,前向算法說完了,下面總結下。

前向算法總結

在這裏插入圖片描述
初值:αi(1)=πiBiy1αi(1) =π_i* B_{iy1}

遞推:對於t = 1, 2, …,T-1

ai(t+1)=(jaj(t)aji)biy(t+1)a_i(t+1) = (∑_j a_j(t)a_{ji})b_{iy(t+1)}

最終:P(Oλ)=iαi(T)P(O|λ) =∑_i α_i(T)

PS:這裏的 αi(t) 中i表示第i號狀態,t表示第t時刻。有的教程中會把i和t位置調換一下,變成 αt(i),其實都一樣。

前向算法例子

假設有3個盒子,編號爲1,2,3,每個盒子都裝有紅白兩種顏色的小球,數目如下:

盒子號 1 2 3
紅球數 5 4 7
白球數 5 6 3

然後按照下面的方法抽取小球,來得到球顏色的觀測序列:

1,按照 π=(0.2, 0.4, 0.4) 的概率選擇1個盒子,從盒子隨機抽出

1個球,記錄顏色後放回盒子;

2,按照下圖A選擇新的盒子,按照下圖B抽取球,重複上述過程;

PS:A的第i行是選擇到第i號盒子,第j列是轉移到j號盒子,如:第一行第二列的0.2代表:上一次選擇1號盒子後這次選擇2號盒子的概率是0.2。

B的第i行是選擇到第i號盒子,第j列是抽取到j號球,如:第二行第一列的0.4代表:選擇了2號盒子後抽取紅球的概率是0.4。
在這裏插入圖片描述
求:得到觀測序列“紅白紅”的概率是多少?

解:

1,明確已知:HMM模型的參數已經如上圖所示了,那我們就需要再明確兩件事:HMM中那“看不見的狀態”和“可見的觀測”分別是什麼。

“可見的觀測”根據題目可知是:y =“紅白紅”, “看不見的狀態”就是這三次分別選擇了什麼盒子,且一共有3個狀態:選中1號盒子、選中2號盒子、選中3號盒子。

2,根據前向算法,第一步計算 αi(1),這很簡單:

αi =1 (t=1) 即時刻1時位於狀態“選中1號盒子”的前向概率,所以:α1(1) =“選中1號盒子”“選中紅球” = π0 B10= 0.2*0.5 = 0.1

同理:α2(1) =0.40.4 = 0.16,α3(1) = 0.40.7 = 0.28。

3,計算 αi(2):

根據公式:

α1(2)=(jα1(2)αj1)b1y2α_1(2) = (∑_j α_1(2)α_{j1}) b_{1y2}

=(0.10.5+0.160.3+0.280.2)0.5= (0.1*0.5 + 0.16*0.3 + 0.28*0.2) * 0.5

=0.077

α2(2) = 0.1104

α3(2) = 0.0606

4,同αi(2),計算αi(3):

α1(3) =0.04187

α2(3) =0.03551

α3(3) =0.05284

5,最終

P(Oλ)=iαi(3)P(O|λ) = ∑_i α_i(3)

= 0.04187 + 0.03551 + 0.05284

= 0.13022

後向算法

有了前向算法的基礎,後向算法就好說了,因爲就是前向算法的反過來:先計算最後一個然後推到第一個,於是詳細說明就不在給了,直接上結論:

後向算法總結

在這裏插入圖片描述
初值:βi(T)=1β_i(T) = 1

PS:概率爲1的原因是 – 本來還需要看看時刻T後面有什麼東西,但因爲最後一個時刻T 後面已經沒有時刻,即不需要再觀測某個東西,所以你隨便給個什麼都行,我不在乎。

遞推:對於t = T-1, T-2,…, 1

βi(t)=(jaijbjy(t+1)βj(t+1))β_i(t) = (∑_j a_{ij}b_{jy(t+1)}β_j(t+1))

PS:這一步是根據t+1的後向概率算t時刻的後向概率βi(t),因此:

βi(t) = 第t時刻位於第i號狀態轉移到第t+1時刻位於第j號狀態的概率aij * 第t+1時刻第j號狀態給出y(t+1) 觀測的概率bjy(t+1) * 第t+1時刻的後驗概率。

最終:P(Oλ)=iπibiy1βi(1)P(O|λ) =∑_i π_ib_{iy1}β_i(1)

PS:同第二步,只不過這裏是第1時刻。

前後向概率的關係

在這裏插入圖片描述
具體推倒就不給出了,總之:

擁有所有觀測時,第t時刻有第i個狀態的概率 = t時刻的前向概率 * t時刻的後向概率,即:

P(it=qi,Yλ)=αi(t)βi(t)P(i_t = q_i, Y | λ ) = α_i(t) * β_i(t)

單個狀態的概率

這裏的單個狀態是什麼呢?就是給定觀測O和HMM的參數 λ 時,在時刻t時位於隱狀態i的概率,記爲:

γt(i)=P(it=qiO,λ)γ_t(i) = P(i_t= q_i | O, λ)

PS:這裏的O是所有觀測的合集,即:O = {y1 = o1, y2 = o2, …,yT = oT}

這個就很強啦,因爲我們可以估計在t時刻的隱狀態,進而求出隱狀態序列!

PS:這個的確是求隱狀態序列的一種方式,但這種有個問題 – 求出的隱狀態之間互相獨立,即:沒有考慮到第t+1時刻的隱狀態是由第t時刻的隱狀態轉移過來的情況。換言之:這樣求得的隱狀態是“每個隱狀態都是僅在當前時刻最優,可每個隱狀態都沒考慮到全局情況”。

而它的求解也很簡單,如下:
在這裏插入圖片描述

兩個狀態的聯合概率

剛纔“單個狀態的概率”求得的t時刻的隱狀態沒有考慮到“上下文”,那就考慮下上下文,即:時刻t位於隱狀態i時,t+1時刻位於隱狀態j,記爲:

ξt(i,j)=P(it=qi,it+1=qjO,λ)ξ_t(i, j) =P(i_t = q_i, i_{t+1} = q_j | O, λ)

求解推導:
在這裏插入圖片描述

一些期望

在這裏插入圖片描述

學習問題

學習問題分兩種:

1, 觀測序列和隱狀態序列都給出,求HMM。

PS:這種學習是監督學習。

2, 給出觀測序列,但沒給出隱狀態序列,求HMM。

PS:這種學習是非監督學習,利用Baum-Welch算法。

觀測序列和隱狀態序列都給出

這種其實求法超簡單:用大數定理用頻率來估算HMM的三種概率就OK了。
在這裏插入圖片描述
解釋:

還是用最開始的分詞的例子。

初始概率:

i = 0:第一個文字是終止字的次數 / (第一個文字是終止字的次數 + 不是終止字的次數)

i = 1:第一個文字不是終止字的次數 / (第一個文字是終止字的次數 + 不是終止字的次數)

轉移概率:

i=0,j=0:第t個字是終止字,第t+1個字是終止字的次數 / (第t個字是終止字,第t+1個字是終止字的次數 + 第t個字是終止字,第t+1個字不是終止字的次數 + 第t個字不是終止字,第t+1個字是終止字的次數 + 第t個字不是終止字,第t+1個字不是終止字的次數)

i=0,j=1、i=1, j=0、i=1, j=1同理。

觀測概率:

i=0,k=0:Unicode編碼中編碼爲0的字是終止字的次數 / (Unicode編碼中編碼爲0的字是終止字的次數 + Unicode編碼中編碼爲0的字不是終止字的次數)

i=1,k=0:Unicode編碼中編碼爲0的字不是終止字的次數 / (Unicode編碼中編碼爲0的字是終止字的次數 + Unicode編碼中編碼爲0的字不是終止字的次數)

其他k=j同理。

Baum-Welch算法

其實該算法的本質就是EM算法,因爲它解決的問題就是:有了觀測值X,而觀測值有個隱變量Z時,求在HMM參數 λ下的聯合概率P(X, Z | λ) 。

PS:我總結的EM算法地址如下:

http://blog.csdn.net/xueyingxue001/article/details/52020673

這裏在貼一下EM算法的步驟:
在這裏插入圖片描述
上面的步驟寫成統一的式子就是:
在這裏插入圖片描述
因此EM算法對應到HMM的學習問題就是:

所有觀測數據寫成O=(o1, o2 …oT),所有隱數據寫成I=(i1, i2 …iT),完全數據是(O, I)=(o1, o2 …oT ,i1,i2 … iT),完全數據的對數似然函數是lnP(O, I | λ)

於是:
在這裏插入圖片描述
就有如下推導:
在這裏插入圖片描述
解釋:

第一行:EM的Q函數。

第二行:條件概率公式。

第三行:

第一:第二行分母代表“上一次求出的參數與觀測集合的聯合概率”,對本次的估計沒幫助,所以可以捨去。

第二:第三行那個是正比符號,即使沒有上一個解釋可是可以保證第二行與第三行是成正比的。

話說,P(O, I | λ) 在“HMM概率計算問題”的“直接/暴力計算法”中已經解出了,這裏再貼下截圖:在這裏插入圖片描述
於是上面可以進一步做如下推導:
在這裏插入圖片描述
對於上式,除了HMM的參數 λ = (A, B, π) 外都是已知的了。

話說上圖將最後一個等號寫在3行是爲了表述一點:這三行的每一行僅包含HMM的一個參數,而我們的目標是求Q函數的最大,於是只要求最後三行的最大就好了。爲了方便說明,我將上圖最後三行的三個式子從上向下依次命名爲:π式,α式,β式。

求 π 式

π 式有個約束:所有πi的和爲1。

於是對於有約束的求極值爲題就拉格朗日乘子法的伺候!

1,拉格朗日函數
在這裏插入圖片描述
2,上式對 πi 求偏導
在這裏插入圖片描述
3,上式對i求和後 πi 的和爲1就把 π 約掉了,從而求出拉格朗日參數
在這裏插入圖片描述
4,將上式帶入第二步的式子就求出了π:
在這裏插入圖片描述
而上式的 γ 就是“HMM概率計算問題”中“單個狀態的概率”中的 γ(PS:不是拉格朗日參數),於是 π 就求出來了!

求 α 式

α 式可以寫成
在這裏插入圖片描述
仍然使用拉格朗日乘子法,得到
在這裏插入圖片描述
上式的 γ 是“HMM概率計算問題”中“單個狀態的概率”中的 γ,上式的 ξ 是“HMM概率計算問題”中“兩個狀態的聯合概率”中的 ξ。

求 β 式

同理,得到:
在這裏插入圖片描述
上式的 γ 是“HMM概率計算問題”中“單個狀態的概率”中的 γ。

預測問題

預測問題有兩種解決辦法:

1, 近似算法。其實就是“HMM概率計算問題”中“單個狀態的概率”的解法。

2, Viterbi 算法。下面講解這個。

VIterbi算法

在介紹維特比算法之前,我先用通俗的語言描述下它。

假設我們遇到了這麼個問題:

大學時你讓室友幫你帶飯(如果你上過大學,別告訴我你沒幹過這事…),然後你室友問你想吃啥?你回答:“你吃啥我吃啥,不過回來時幫忙帶瓶雪碧,謝啦”。於是有趣的事就發生了:你室友給你帶回了飯和雪碧並興高采烈的說:“我去,食堂換大廚了,那個小賣部的收銀員換成了個漂亮妹子!!”然後你問他:“你去的哪個食堂和小賣部?”,他想了想回答:“你猜。”

好了,你猜吧~

我猜你妹啊(╯‵□′)╯︵┻━┻

嘛,先別慌掀桌,不管如何你室友幫你帶了飯,所以咱們就滿足下他那小小的惡作劇,就當做是給他跑腿的辛苦費好了。

PS:假設你學校有2個小賣部和2個食堂。

於是,mission start!

首先,問他:你先去得小賣部?他回答:是的。

OK,買東西的先後順序搞定了,如下圖:
在這裏插入圖片描述
接下來開始思考:

第一步:從宿舍到小賣部A和B的距離都差不多,不好判斷,即從宿舍到小賣部A的概率 = 從宿舍到小賣部B的概率,如下圖;
在這裏插入圖片描述
第二步:從小賣部A、B到食堂1、2有四種路線(A1, A2, B1, B2),然後這四種路線中到食堂1最短的是A1,到食堂2最短的是B2,然後這貨絕對那個近選哪個,所以如果去食堂1,則他會選擇A1,如果去食堂2,則他會選擇B2,如下圖:
在這裏插入圖片描述
第三步:看看他給帶來的飯,嗯…這個飯我記得食堂1有賣,食堂2不知道,就當沒有吧,那就假設他去的是食堂1,如下圖:
在這裏插入圖片描述
第四步:OK,終點已經確定,接下來反推回去,就好了,即:他絕壁選個最近的小賣部,所以他會選擇距離食堂1最近的小賣部A,如下圖:
在這裏插入圖片描述
第五步:對他說:“你先去小賣部A然後去食堂1對吧”,他說:“我次奧,你咋知道的”。

OK,例子舉完了,我們來看看維特比算法,其實維特比算法就是上面的過程: 1,先從前向後推出一步步路徑的最大可能,最終會得到一個從起點連接每一個終點的m條路徑(假設有m個終點)。

2,確定終點之後在反過來選擇前面的路徑。

3,確定最優路徑。

下面看看Viterbi算法的定義。

Viterbi 算法的定義

定義變量δt(i):表示時刻t狀態爲i的所有路徑中的概率最大值,公式如下:
在這裏插入圖片描述
過程:
在這裏插入圖片描述
上面的符號之前都已經見過,這裏不再解釋,下面爲了更好地理解這幾步,我們來舉個例子。

例子

還是盒子球模型。

盒子和球模型λ= (A, B,π),狀態集合Q={1, 2, 3},觀測集合V={紅, 白},
在這裏插入圖片描述
已知觀測序列O=(紅,白,紅),試求最優狀態序列,即最優路徑I*= (i1*, i2*, i3*)。

解:

如下圖所示(圖中的數字在之後的步驟中會一一推導出來)
在這裏插入圖片描述
要在所有可能的路徑中選擇一條最優路徑,按照以下步驟出來。

1,初始化

t=1時,對每個狀態i, i=1, 2, 3,求狀態爲i觀測o1爲紅的概率,記此概率爲δ1(i),則:

δ1(i)=πibi(o1)=πibi()δ_1(i) = π_ib_i(o1)=π_ib_i(紅), i = 1, 2, 3

代入實際數據

δ1(1) = 0.10,δ1(2) =0.16,δ1(3) = 0.28

記ψ1(i) = 0,i = 1, 2, 3。

2,在t=n時

t=2時,對每個狀態i,求在t=1時狀態爲j觀測爲紅並且在t=2時狀態爲i觀測爲白的路徑的最大概率,記概率爲δ2(t),則根據:
在這裏插入圖片描述
同時,對每個狀態i, i = 1, 2, 3,記錄概率最大路徑的前一個狀態j:
在這裏插入圖片描述
計算:
在這裏插入圖片描述
同樣,在t=3時
在這裏插入圖片描述
3,求最優路徑的終點

以P*表示最優路徑的概率,則
在這裏插入圖片描述
最優路徑的終點是i3i_3^*:
在這裏插入圖片描述
4,逆向找i2i_2^*,i1i_1^*
在t=2時,i2=ψ3(i3)=ψ3(3)=3i_2^* = ψ_3(i_3^*) =ψ_3(3) = 3

在t=2時,i1=ψ2(i2)=ψ2(3)=3i_1^* = ψ_2(i_2^*) =ψ_2(3) = 3

於是求得最優路徑,即最有狀態序列I=(i1,i2,i3)=(3,3,3)I* = (i_1^*,i_2^*, i_3^*) = (3, 3, 3)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章