1. 程式人生 > >隱含馬爾科夫模型的訓練

隱含馬爾科夫模型的訓練

在這裡我們仍然使用非常簡單的天氣模型來做說明。


在這個馬爾可夫模型中,存在三個狀態,Sunny, Rainy, Cloudy,同時圖片上標的是各個狀態間的轉移概率(如果不明白什麼是轉移概率,那建議先去學習什麼是馬爾可夫再來看HMM)。

現在我們要說明什麼是 HMM。既是隱形,說明這些狀態是觀測不到的,相應的,我們可以通過其他方式來『猜測』或是『推斷』這些狀態,這也是 HMM 需要解決的問題之一。

舉個例子,我女朋友現在在北京工作,而我還在法國讀書。每天下班之後,她會根據天氣情況有相應的活動:或是去商場購物,或是去公園散步,或是回家收拾房間。我們有時候會通電話,她會告訴我她這幾天做了什麼,而閒著沒事的我呢,則要通過她的行為猜測這幾天對應的天氣最有可能是什麼樣子的。

以上就是一個簡單的 HMM,天氣狀況屬於狀態序列,而她的行為則屬於觀測序列。天氣狀況的轉換是一個馬爾可夫序列。而根據天氣的不同,有相對應的概率產生不同的行為。在這裡,為了簡化,把天氣情況簡單歸結為晴天和雨天兩種情況。雨天,她選擇去散步,購物,收拾的概率分別是0.1,0.4,0.5, 而如果是晴天,她選擇去散步,購物,收拾的概率分別是0.6,0.3,0.1。而天氣的轉換情況如下:這一天下雨,則下一天依然下雨的概率是0.7,而轉換成晴天的概率是0.3;這一天是晴天,則下一天依然是晴天的概率是0.6,而轉換成雨天的概率是0.4. 同時還存在一個初始概率,也就是第一天下雨的概率是0.6, 晴天的概率是0.4.


根據以上的資訊,我們得到了 HMM的一些基本要素:初始概率分佈 π,狀態轉移矩陣 A,觀測量的概率分佈 B,同時有兩個狀態,三種可能的觀測值。

現在,重點是要了解並解決HMM 的三個問題。

問題1,已知整個模型,我女朋友告訴我,連續三天,她下班後做的事情分別是:散步,購物,收拾。那麼,根據模型,計算產生這些行為的概率是多少。

問題2,同樣知曉這個模型,同樣是這三件事,我女朋友要我猜,這三天她下班後北京的天氣是怎麼樣的。這三天怎麼樣的天氣才最有可能讓她做這樣的事情。

問題3,最複雜的,我女朋友只告訴我這三天她分別做了這三件事,而其他什麼資訊我都沒有。她要我建立一個模型,晴雨轉換概率,第一天天氣情況的概率分佈,根據天氣情況她選擇做某事的概率分佈。(慘絕人寰)

而要解決這些問題,偉大的大師們分別找出了對應的演算法。問題一,Forward Algorithm,向前演算法,或者 Backward Algo,向後演算法。 問題二,Viterbi Algo,維特比演算法。問題三,Baum-Welch Algo,鮑姆-韋爾奇演算法(中文好繞口)。

儘管例子有些荒謬(天氣情況要複雜的多,而且不太可能滿足馬爾可夫性質;同時,女朋友要做什麼往往由心情決定而不由天氣決定。而從問題一來看,一定是天數越多,這個概率就會越低;從問題三來看,觀察到的行為越多,模型才能更準確一些),但是應該已經簡單卻又詳盡地解釋了什麼是 HMM。如果只是想了解個大概,到此為止。
問題1的解決1:遍歷演算法。


要計算產生這一系列行為的概率,那我們把每一種天氣情況下產生這些行為都羅列出來,那每種情況的和就是這個概率。有三天,每天有兩種可能的天氣情況,則總共有 2的三次=8種 情況.
舉例其中一種情況 : P(下雨,下雨,下雨,散步,購物,收拾)=P(第一天下雨)P(第一天下雨去散步)P(第二天接著下雨)P(下雨去購物)P(第三天還下雨)P(下雨回家收拾)=0.6X0.1X0.7X0.4X0.7X0.5=0.00588
當然,這裡面的 P(第二天接著下雨)當然是已知第一天下雨的情況下,第二天下雨的概率,為0.7.
將八種情況相加可得,三天的行為為{散步,購物,收拾}的可能性為0.033612. 看似簡單易計算,但是一旦觀察序列變長,計算量就會非常龐大( N^T
的複雜度,T 為觀測序列的長度)。

問題1 的解決2:向前演算法。


先計算 t=1時刻,發生『散步』一行為的概率,如果下雨,則為 P(散步,下雨)=P(第一天下雨)X P(散步 | 下雨)=0.6X0.1=0.06;晴天,P(散步,晴天)=0.4X0.6=0.24

t=2 時刻,發生『購物』的概率,當然,這個概率可以從 t=1 時刻計算而來。

如果t=2下雨,則 P(第一天散步,第二天購物, 第二天下雨)= 【P(第一天散步,第一天下雨)X P(第二天下雨 | 第一天下雨)+P(第一天散步,第一天晴天)X P(第二天下雨 | 第一天晴天)】X P(第二天購物 | 第二天下雨)=【0.06X0.7+0.24X0.3】X0.4=0.0552

如果 t=2晴天,則 P(第一天散步,第二天購物,第二天晴天)=0.0486 (同理可得,請自行推理)

如果 t=3,下雨,則 P(第一天散步,第二天購物,第三天收拾,第三天下雨)=【P(第一天散步,第二天購物,第二天下雨)X P(第三天下雨 | 第二天下雨)+ P(第一天散步,第二天購物,第二天天晴)X P(第三天下雨 | 第二天天晴)】X P(第三天收拾 | 第三天下雨)=【0.0552X0.7+0.0486X0.4】X0.5= 0.02904

如果t=3,晴天,則 P(第一天散步,第二天購物,第三天收拾,第三天晴天)= 0.004572

那麼 P(第一天散步,第二天購物,第三天收拾),這一概率則是第三天,下雨和晴天兩種情況的概率和。0.02904+0.004572=0.033612.

以上例子可以看出,向前演算法計算了每個時間點時,每個狀態的發生觀測序列的概率,看似繁雜,但在 T 變大時,複雜度會大大降低。


問題1的解決3:向後演算法


顧名思義,向前演算法是在時間 t=1的時候,一步一步往前計算。而相反的,向後演算法則是倒退著,從最後一個狀態開始,慢慢往後推。

初始化: \beta_3(Rainy)=1 (第一次使用知乎的公式編輯,還蠻靠譜的嘛)
\beta_3(Sunny)=1

遞推: \beta_2(Rainy)=a_{Rainy\to Rainy}b_{Rainy}(O_3=Clean)\beta_3(Rainy)+a_{Rainy\to Sunny}b_{Sunny}(O_3=Clean)\beta_3(Sunny)
=0,.7x0.5x1+0.3x0.1x1=0.38
其中第一項則是轉移概率,第二天下雨轉到第三天下雨的概率為0.7;第二項則是觀測概率,第三天下雨的狀況下,在家收拾的概率為0.5;第三項就是我們定義的向後變數(backward variable)。
同理推得\beta_1(Rainy)=0.1298\\
\beta_1(Sunny)=0.1076" eeimg="1">

結束:P(散步,購物,收拾) = \pi_{Rainy}b_{Rainy}(O_1=Walke)\beta_1(Rainy)+\pi_{Sunny}b_{Sunny}(O_1=Walke)\beta_1(Sunny)=0.6×0.1×0.1298+0.4×0.6×0.1076


=0.033612



三種演算法的答案是一致的。


問題2的解決:維特比演算法

維特比演算法致力於尋找一條最佳路徑,以便能最好地解釋觀測到的序列。


初始化:\delta_1(Sunny)=\pi_S\times b_S(O_1=Walk)=0.24" eeimg="1">

初始路徑:\phi_1(Sunny)=0" eeimg="1">


遞推,當然是要找出概率比較大的那條路徑。

\delta_2(Rainy)=max[\delta_1(R)\times a_{R\to R},\delta_1(S)\times a_{S\to R}]\times b_R(O_2=Shop)=0.0384

那麼,到達第二天下雨這一狀態的最佳路徑,應該是:

\phi_2(Rainy)=\arg\max[\delta_1(R)\times a_{R\to R},\delta_1(S)\times a_{S\to R}]=Sunny

也就是說,第一天是晴天的可能性更大。

同樣地,可以推得,\phi_2(Sunny)=Sunny\\
\delta_3(Rainy)=0.01344\\
\phi_3(Rainy)=Rainy\\
\delta_3(Sunny)=0.002592\\
\phi_3(Sunny)=Sunny
" eeimg="1">

結束:比較 \delta_3(Rainy) \quad and \quad \delta_3(Sunny) 的大小,發現前者較大,則最後一天的狀態最有可能是 下雨天。

回推:根據 \phi_3(Rainy)=Rainy 可知,到達第三天下雨這一狀態,最有可能是第二天也下雨,再根據 \phi_2(Rainy)=Sunny可知,到達第二天下雨這一狀態,最有可能是第一天是晴天。

由此,我們得到了最佳路徑,即,晴天,雨天,雨天。   作者:henry
連結:https://www.zhihu.com/question/20962240/answer/64187492
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。