概率圖模型之(HMM)隱馬模型(隱馬爾可夫)

在講隱馬模型之前想许,首先要了解下偿渡,啥是馬爾可夫模型免姿。

馬爾可夫模型

幾個條件

  • 當前狀態(tài)只與前一個狀態(tài)相關
  • 一個狀態(tài)到所有狀態(tài)的轉(zhuǎn)移概率和為1
  • 概率大于等于0小于等于1
  • 狀態(tài)起始概率和為1
    舉個例子:
    在文本中,假設有三個狀態(tài)施符,名詞n,動詞v擂找,形容詞adj,三者之間的轉(zhuǎn)移概率為(瞎編):
    \left[ \begin{matrix} &n & v & adj \\ n&0.1 &0. 2 & 0.7 \\ v&0.4 & 0.5 & 0.1 \\ adj&0.5 & 0.3 & 0.2 \end{matrix} \right]
    初始化概率為p(adj) = 0.5浩销,p(n)=0.3,p(v)=0.2.
    那么贯涎,一個文本詞性為 形容詞,名詞慢洋,動詞塘雳,名詞的概率為:
    p =p(adj)*p(n|adj) *p(v|n) *p(n|v) = 0.5*0.5*0.2*0.4 = 0.02
    相當于n-gram語言模型中陆盘,n = 2 的情況。

隱馬爾可夫模型

在上述例子中败明,文本的詞性是明確的隘马,而隱馬模型中,不知道所經(jīng)歷的狀態(tài)序列妻顶,觀察到的序列是隨機的酸员。所以,狀態(tài)轉(zhuǎn)換是隨機的讳嘱,觀測序列也是隨機的幔嗦,雙重隨機過程。



舉個例子:我 吃 飯沥潭。這里我們能夠觀測到的就是邀泉,‘我’,‘吃’钝鸽,‘飯’汇恤。
那么‘我’對應的狀態(tài)有‘動詞’,‘名詞’拔恰,‘形容詞’因谎,‘吃’,‘飯’同理仁连。那么他們的背后詞性序列蓝角,到底是 名動名,還是動動名饭冬,還是形動名不得而知使鹅。這種未知序列稱之為隱狀態(tài)。
所以:隱馬模型三要素昌抠,一個是狀態(tài)轉(zhuǎn)移矩陣(同上)患朱,另一個是觀測狀態(tài)到隱藏狀態(tài)的概率矩陣。還有一個起始狀態(tài)概率炊苫。

隱馬模型的三個問題
  • 如何計算 觀測序列O 的概率
  • 如和計算 觀測序列O 最優(yōu)的隱狀態(tài)序列
  • 參數(shù)如何學習
問題一:

p(O) = \sum_Qp(O|Q)*p(Q)
這樣相當于是窮舉所有可能裁厅。即,O1的狀態(tài)概率O2的狀態(tài)概率狀態(tài)之間的概率轉(zhuǎn)移侨艾。這樣执虹,狀態(tài)一多,觀測長度一長唠梨,計算將會指數(shù)增長袋励。
為了優(yōu)化求解時間,采用動態(tài)規(guī)劃的思想,即O1茬故,到O2盖灸,在計算O2,到O3,一次類推磺芭,最終計算到Ot.
那么復雜度即赁炎,O1有N個狀態(tài),O2有N個狀態(tài)钾腺,那么計算O1到O2徙垫,就需要計算N*N 次,最終算得N個路徑垮庐,通往O3松邪,解釋有點繞∩诓椋總共t次逗抑。隨意復雜度為O(N^2*T)。具體算法可以查看 前向算法寒亥。大概樣子就是如下所示:

問題二:

一般在問題二在NLP的應用中較多邮府,需要找到當前觀測序列最優(yōu)的標注。
如何快速的找到最優(yōu)的序列溉奕。
維特比算法:
算法原理這里不做闡述褂傀。這篇博客講的非常通俗易懂~
https://blog.csdn.net/athemeroy/article/details/79339546
算法實現(xiàn):
首先需要一個隱馬模型:
寫了個隨機函數(shù),生成隱馬模型

def hmmRamdon():
    #隱狀態(tài)個數(shù)
    yin_num = 5
    #觀測概率個數(shù)
    guan_num = 10
    
    A = np.zeros((yin_num,yin_num))
    for i in range(yin_num):
        rows_h = np.random.random(yin_num)
        rows_v = np.random.random(yin_num)

        for k in range(i):
            rows_h[k] = A[i][k]

        rows_h[i:] = rows_h[i:] / rows_h[i:].sum() * (1 - rows_h[:i].sum())   
        A[i] = rows_h

        for k in range(i+1):
            rows_v[k] = A[k][i] 
        rows_v[i+1:] = rows_v[i+1:] / rows_v[i+1:].sum() * (1 - rows_v[:i+1].sum())

        for j in range(yin_num):
            A[j][i] = rows_v[j]
            
    
    B = np.zeros((yin_num,guan_num))
    for i in range(yin_num):
        row = np.random.random(guan_num)
        B[i] = row / row.sum()
    
    init_yin = np.random.random(yin_num)
    pai = init_yin / init_yin.sum()
    return A,B,pai

函數(shù)沒有做大于0校驗~加勤,隨出負數(shù)的話記得多隨幾次哈~

看過上述講解維特比算法原理博客的同鞋仙辟,應該記得下圖:



在HMM,中A->B相當于鳄梅,觀測序列的中 第一個序列叠国,B1->B3是隱狀態(tài),
所以當前A->B的路徑可以初始化為
這里展示方便戴尸,假設HMM模型為

A = np.array([[0.5,0.2,0.3],
              [0.3,0.5,0.2],
              [0.2,0.3,0.5]])
B = np.array([[0.5,0.5],
              [0.4,0.6],
              [0.7,0.3]])
pai = np.array([[0.2,0.4,0.4]])

observe = [0,1,0]  
a_ex = B[:,observe[0]] * pai
a_ex = a_ex.T 
all_way = np.full((yin_num, 1), -1)
print(a_ex)
print(all_way)
[[0.1 ]
 [0.16]
 [0.28]]
===========
[[-1]
 [-1]
 [-1]]

a_ex記錄到達上一個觀測狀態(tài)每個隱狀態(tài)最優(yōu)的概率值粟焊。
observe[0]觀測序列第一個,觀測概率各自乘于初始化概率孙蒙。all_way 用于記錄每條路徑經(jīng)過的隱狀態(tài)節(jié)點项棠。0.1 = 0.5 * 0.2,0.16 = 0.4 * 0.4挎峦,0.28 = 0.7 * 0.4.
當計算由B->C時香追,C1,C2坦胶,C3 各自有三條路徑翅阵,歪玲,結(jié)合A-B的路徑,計算出A->C1概率最高的一條路徑掷匠,同理計算到C2,C3的路徑岖圈。

a_new = A1 *a_ex* B1[:,observe[1]]#計算圖中9個路線
a_ex = np.amax(a_new,axis=0) #獲取每個隱狀態(tài)三個路徑中最高的那一個
a_ex = a_ex.reshape(a_ex.shape[0],-1)
            
way = np.argmax(a_new,axis=0)#找出概率最高的三條路線
way = way.reshape(way.shape[0],-1)
all_way = np.hstack((all_way,way))#路徑更新
a_new:
[[0.025  0.012  0.009 ]
 [0.024  0.048  0.0096]
 [0.028  0.0504 0.042 ]]
a_ex:
[[0.028 ]
 [0.0504]
 [0.042 ]]
all_way:
[[-1  2]
 [-1  2]
 [-1  2]]

所以對應圖中的三條路徑為A-B3-C1讹语,A-B3-C2,A-B3-C3蜂科。
即博客中對應的圖


如此循環(huán)直到最后一個顽决。完整算法代碼如下:

import numpy as np
def viterbi_search(A,B,pai,observe):
    yin_num = A.shape[0]
     
    for j in range(len(observe)):
        if j == 0:
            a_ex = B[:,observe[j]] * pai
            a_ex = a_ex.T 
            all_way = np.full((yin_num, 1), -1)
        else: 
            a_new = A1 *a_ex* B1[:,observe[j]]
            a_ex = np.amax(a_new,axis=0) 
            a_ex = a_ex.reshape(a_ex.shape[0],-1)

            way = np.argmax(a_new,axis=0)
            way = way.reshape(way.shape[0],-1)
            all_way = np.hstack((all_way,way)) 
            
    result = np.append(all_way[a_ex.argmax()],a_ex.argmax())
    
    return result, a_ex.max()

實驗環(huán)境jupyter,實驗代碼下載鏈接:
鏈接:https://pan.baidu.com/s/1W9zckhKG3yssFeZtahl-5g 密碼:78y5

問題三:參數(shù)估計

最大似然估計:
轉(zhuǎn)移概率:aij = ai 到aj的次數(shù) / ai到所有狀態(tài)的次數(shù)导匣。
觀測概率:bi = ai 到 bi 觀測的次數(shù) / ai到所有觀測的次數(shù)才菠。

一般隱狀態(tài)未知的情況下,可以用最大期望EM贡定,對轉(zhuǎn)移概率進行估計赋访。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缓待,隨后出現(xiàn)的幾起案子蚓耽,更是在濱河造成了極大的恐慌,老刑警劉巖旋炒,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件步悠,死亡現(xiàn)場離奇詭異,居然都是意外死亡瘫镇,警方通過查閱死者的電腦和手機鼎兽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铣除,“玉大人谚咬,你說我怎么就攤上這事⊥酰” “怎么了序宦?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長背苦。 經(jīng)常有香客問我互捌,道長,這世上最難降的妖魔是什么行剂? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任秕噪,我火速辦了婚禮,結(jié)果婚禮上厚宰,老公的妹妹穿的比我還像新娘腌巾。我一直安慰自己遂填,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布澈蝙。 她就那樣靜靜地躺著吓坚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灯荧。 梳的紋絲不亂的頭發(fā)上礁击,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音逗载,去河邊找鬼哆窿。 笑死,一個胖子當著我的面吹牛厉斟,可吹牛的內(nèi)容都是我干的挚躯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼擦秽,長吁一口氣:“原來是場噩夢啊……” “哼码荔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起号涯,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤目胡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后链快,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體誉己,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年域蜗,在試婚紗的時候發(fā)現(xiàn)自己被綠了巨双。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡霉祸,死狀恐怖筑累,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丝蹭,我是刑警寧澤慢宗,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站奔穿,受9級特大地震影響镜沽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贱田,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一缅茉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧男摧,春花似錦蔬墩、人聲如沸译打。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奏司。三九已至,卻和暖如春蔬蕊,著一層夾襖步出監(jiān)牢的瞬間结澄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工岸夯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人们妥。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓猜扮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親监婶。 傳聞我的和親對象是個殘疾皇子旅赢,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 隱馬爾可夫模型(Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些學者發(fā)表...
    vlnk2012閱讀 6,592評論 3 47
  • 本系列第三篇惑惶,承接前面的《淺談機器學習基礎》和《淺談深度學習基礎》煮盼。 自然語言處理緒論 什么是自然語言處理? 自然...
    我偏笑_NSNirvana閱讀 17,516評論 2 68
  • 1 簡介 隱馬爾可夫模型(Hidden Markov Model)带污,簡稱HMM僵控, 是一種基于概率統(tǒng)計的模型,是一種...
    高永峰_GYF閱讀 1,541評論 0 1
  • 定義: 關于時序的概率模型鱼冀,描述由一個隱藏得馬爾可夫鏈隨機生成不可觀測的狀態(tài)隨機序列报破,再由各個狀態(tài)生成一個觀測而產(chǎn)...
    __jwzhang__閱讀 633評論 0 1
  • 轉(zhuǎn)自:小象學院+自己總結(jié) 模型+策略+算法 隱馬爾可夫模型是用于標注問題,描述由隱藏的馬爾科夫鏈隨機生成觀測序列的...
    士多啤梨蘋果橙_cc15閱讀 576評論 0 1