1. 程式人生 > >機器學習_4.隱馬爾可夫模型初識

機器學習_4.隱馬爾可夫模型初識

預備知識——熵

隱馬爾可夫模型是從統計的基礎上發展起來的,因此首先需要掌握以下幾點:

  1. 熵是表示物質系統狀態的一種度量,用以表示系統的無序程度,也可稱不確定性程度。在資訊理論中,夏農使用熵來表示資訊系統的平均資訊量,即平均不確定程度。
  2. 最大熵原理是一種選擇隨機變數統計特性最符合客觀情況的準則,也稱為最大資訊原理。隨機量的概率分佈是很難測定的,一般只能測得其各種均值(如數學期望、方差等)或已知某些限定條件下的值(如峰值、取值個數等),符合測得這些值的分佈可有多種、以至無窮多種,通常,其中有一種分佈的熵最大。選用這種具有最大熵的分佈作為該隨機變數的分佈,是一種有效的處理方法和準則。這種方法雖有一定的主觀性,但可以認為是最符合客觀情況的一種選擇。在投資時常常講不要把所有的雞蛋放在一個籃子裡,這樣可以降低風險。在資訊處理中,這個原理同樣適用。在
    數學
    上,這個原理稱為最大熵原理。(百度百科)
  3. 最大熵是形式上最漂亮但實現最複雜的模型之一,在此方面專家們進行了各種嘗試,建立了各種演算法和最大熵模型,研究仍在進行中。

馬爾可夫

馬爾可夫(1856~1922),蘇聯數學家。切比雪夫的學生。在概率論、數論函式逼近論和微分方程等方面卓有成就。他的主要著作有《概率演算》等。在數論方面,他研究了連分數和二次不定式理論 ,解決了許多難題 。在概率論中,他發展了矩法,擴大了大數律和中心極限定理的應用範圍。馬爾可夫最重要的工作是在1906~1912年間,提出並研究了一種能用數學分析方法研究自然過程的一般圖式——馬爾可夫鏈。同時開創了對一種無後效性的

隨機過程——馬爾可夫過程的研究。馬爾可夫經多次觀察試驗發現,一個系統的狀態轉換過程中第n次轉換獲得的狀態常決定於前一次(第n-1次)試驗的結果。馬爾可夫進行深入研究後指出:對於一個系統,由一個狀態轉至另一個狀態的轉換過程中,存在著轉移概率,並且這種轉移概率可以依據其緊接的前一種狀態推算出來,與該系統的原始狀態和此次轉移前的馬爾可夫過程無關。馬爾可夫鏈理論與方法已經被廣泛應用於自然科學、工程技術和公用事業中。

馬爾可夫鏈

其為在數學中具有馬爾可夫性質的離散時間隨機過程,在給定當前知識或資訊的情況下,過去(即當前以前的歷史狀態)對於預測將來(即當前以後的未來狀態)是無關的。

馬爾可夫鏈是

隨機變數X1,X2,X3…的一個數列。這些變數的範圍,即他們所有可能取值的集合,被稱為“狀態空間”,而Xn的值則是在時間n的狀態。如果Xn + 1對於過去狀態的條件概率分佈僅是Xn的一個函式,則

P(Xn+1=x∣X0,X1,X2,…,Xn)=P(Xn+1=x∣Xn)

時間和狀態都是離散的馬爾可夫過程稱為馬爾可夫鏈, 簡記為Xn=X(n),n=0,1,2…

這裡x為過程中的某個狀態。上面這個恆等式可以被看作是馬爾可夫性質。

隱馬爾可夫模型(HMM)

馬爾可夫模型馬爾可夫鏈的一種,它的狀態不能直接觀察到,但能通過觀測向量序列觀察到,每個觀測向量都是通過某些概率密度分佈表現為各種狀態,每一個觀測向量是由一個具有相應概率密度分佈的狀態序列產生。所以,隱馬爾可夫模型是一個雙重隨機過程----具有一定狀態數的隱馬爾可夫鏈和顯示隨機函式集。自20世紀80年代以來,HMM被應用於語音識別,取得重大成功。到了90年代,HMM還被引入計算機文字識別和行動通訊核心技術“多使用者的檢測”。HMM在生物資訊科學、故障診斷等領域也開始得到應用。

可以用五個元素來描述,包括2個狀態集合和3個概率矩陣: 隱含狀態 S、可觀測狀態 O、初始狀態概率矩陣 π、隱含狀態轉移概率矩陣 A。、觀測狀態轉移概率矩陣 B (英文名為Confusion Matrix,直譯為混淆矩陣不太易於從字面理解)。一般的,可以用λ=(A,B,π)三元組來簡潔的表示一個隱馬爾可夫模型。隱馬爾可夫模型實際上是標準馬爾可夫模型的擴充套件,添加了可觀測狀態集合和這些狀態與隱含狀態之間的概率關係。

一個含有 N 個狀態的一階過程有 N2 個狀態轉移。每一個轉移的概率叫做狀態轉移概率 (state transition probability),就是從一個狀態轉移到另一個狀態的概率。這所有的 N2 個概率可以用一個狀態轉移矩陣來表示,其表示形式如下:

約束條件為:

在模型的構建中,難點是從可觀察的引數中確定該過程的隱含引數。然後利用這些引數來作進一步的分析,例如模式識別。

對 HMM 來說,有如下三個重要假設,儘管這些假設是不現實的。

  

  假設1:馬爾可夫假設(狀態構成一階馬爾可夫鏈)

  假設2:不動性假設(狀態與具體時間無關)

  假設3:輸出獨立性假設(輸出僅與當前狀態有關)

  隱藏的狀態和可觀察到的狀態之間有一種概率上的關係,也就是說某種隱藏狀態 H 被認為是某個可以觀察的狀態 O1 是有概率的,假設為 P(O1 | H)。如果可以觀察的狀態有3種,那麼很顯然 P(O1 | H)+P(O2 | H)+ P(O3 | H) = 1

 

  這樣,我們也可以得到一個另一個矩陣,稱為混淆矩陣 (confusion matrix)。這個矩陣的內容是某個隱藏的狀態被分別觀察成幾種不同的可以觀察的狀態的概率

舉個例子:

假設,小明在教學樓裡,他隨機去1、2、3三層樓裡的房間,其中一樓只有101、102、……、110十個房間,二樓有201、……、212十二個房間,三樓有301、……、314十四個房間。在同一層樓中,去每個房間都是等概率的,即一樓每個教室都是1/10,二樓每個教室都是1/12,三樓每個教室都是1/14。並且從一層樓前往其他任一層樓的概率都是1/3。如果我們只考慮房間號,則小明隨機進入房間,會有1、2、3、4、5、6、7、8、9、10、11、12、13、14中的一個。不停的重複,則會得到房間號組成的字串。

實驗十次,我們可能會得到:1 3 5 7 3 10 13 2 1 6,這種可見的鏈即為可見狀態鏈,對應的還有一串隱含狀態鏈,此時即為十次中去的房間所在樓層如:L1、L3、L2、L3、L1、L3、L3、L3、L1、L2。HMM中說到的馬爾可夫鏈其實是指隱含狀態鏈,因為隱含狀態(樓層)之間存在轉換概率(transition probability)。而如果樓層之間轉換的概率是不同的,那麼就會產生新的HMM。而在實際應用中,往往上述的資訊並沒有那麼全面,因此就要使用演算法去估計這些缺失值。

HMM相關演算法主要聚焦於以下三種問題:

  1. 在已知隱含狀態數量、隱含狀態之間的轉移概率,根據可見狀態鏈求隱含狀態鏈;
  2. 在已知隱含狀態數量、隱含狀態之間的轉移概率,根據可見狀態鏈求此結果的概率;
  3. 僅知道隱含狀態數量,根據可見狀態鏈求隱含狀態間的轉換概率。

如果是求解“已知隱含狀態的數量和隱含狀態鏈,根據隱含狀態鏈求此鏈的概率”是簡單的,上方例項中十次概率相乘。

而如果解決問題一,參照https://www.cnblogs.com/skyme/p/4651331.html,我們可以解最大似然路徑問題,即已知可見狀態鏈的情況下求十次結果中每次最可能的隱含狀態。最簡單的就是窮舉所有,然後求最大概率的序列。如過可見狀態鏈太長了就很難完成這一任務了。有個知名的演算法叫做Viterbi algorithm,即取各個可見狀態鏈的每一個節點最可能的隱含狀態。

Vitebi algorithm

HMM(隱馬爾可夫模型)是用來描述隱含未知引數的統計模型,舉一個經典的例子:一個東京的朋友每天根據天氣{下雨,天晴}決定當天的活動{公園散步,購物,清理房間}中的一種,我每天只能在twitter上看到她發的推“啊,我前天公園散步、昨天購物、今天清理房間了!”,那麼我可以根據她發的推特推斷東京這三天的天氣。在這個例子裡,顯狀態是活動,隱狀態是天氣。

任何一個HMM都可以通過下列五元組來描述:

6cbb8645gw1egs40a3bpmj208n09574o

偽碼如下:

states = ('Rainy', 'Sunny')
 
observations = ('walk', 'shop', 'clean')
 
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
 
transition_probability = {
    'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
    'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
    }
 
emission_probability = {
    'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
    'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}

求解最可能的天氣

 

求解最可能的隱狀態序列是HMM的三個典型問題之一,通常用維特比演算法解決。維特比演算法就是求解HMM上的最短路徑(-log(prob),也即是最大概率)的演算法。

稍微用中文講講思路,很明顯,第一天天晴還是下雨可以算出來:

  1. 定義V[時間][今天天氣] = 概率,注意今天天氣指的是,前幾天的天氣都確定下來了(概率最大)今天天氣是X的概率,這裡的概率就是一個累乘的概率了。

  2.     因為第一天我的朋友去散步了,所以第一天下雨的概率V[第一天][下雨] = 初始概率[下雨] * 發射概率[下雨][散步] = 0.6 * 0.1 = 0.06,同理可得V[第一天][天晴] = 0.24 。從直覺上來看,因為第一天朋友出門了,她一般喜歡在天晴的時候散步,所以第一天天晴的概率比較大,數字與直覺統一了。

  3. 從第二天開始,對於每種天氣Y,都有前一天天氣是X的概率 * X轉移到Y的概率 * Y天氣下朋友進行這天這種活動的概率。因為前一天天氣X有兩種可能,所以Y的概率有兩個,選取其中較大一個作為V[第二天][天氣Y]的概率,同時將今天的天氣加入到結果序列中

  4. 比較V[最後一天][下雨]和[最後一天][天晴]的概率,找出較大的哪一個對應的序列,就是最終結果。

演算法的程式碼可以在github上看到,地址為:

https://github.com/hankcs/Viterbi

執行完成後根據Viterbi得到結果:

Sunny Rainy Rainy