姓名:周小蓬 16019110037
轉(zhuǎn)載自:http://blog.csdn.net/gongxifacai_believe/article/details/68948171
[嵌牛導(dǎo)讀]
隱形馬爾可夫模型,英文是 Hidden Markov Models氏捞,所以以下就簡(jiǎn)稱 HMM。
既是馬爾可夫模型怀估,就一定存在馬爾可夫鏈,該馬爾可夫鏈服從馬爾可夫性質(zhì):即無記憶性善玫。也就是說工窍,這一時(shí)刻的狀態(tài),受且只受前一時(shí)刻的影響壁畸,而不受更往前時(shí)刻的狀態(tài)的影響贼急。
隱馬爾可夫(HMM)好講,簡(jiǎn)單易懂不好講捏萍。我認(rèn)為@者也的回答沒什么錯(cuò)誤竿裂,不過我想說個(gè)更通俗易懂的例子。我希望我的讀者不是專家照弥,而是對(duì)這個(gè)問題感興趣的入門者腻异,所以我會(huì)多闡述數(shù)學(xué)思想,少寫公式这揣』诔#霍金曾經(jīng)說過,你多寫一個(gè)公式给赞,就會(huì)少一半的讀者机打。所以時(shí)間簡(jiǎn)史這本關(guān)于物理的書和麥當(dāng)娜關(guān)于性的書賣的一樣好。我會(huì)效仿這一做法片迅,寫最通俗易懂的答案残邀。
[嵌牛鼻子]
人工智能
基本概念
[嵌牛提問]
什么是隱馬爾可夫模型
如何學(xué)習(xí)
[嵌牛正文]
還是用最經(jīng)典的例子,擲骰子柑蛇。假設(shè)我手里有三個(gè)不同的骰子芥挣。第一個(gè)骰子是我們平常見的骰子(稱這個(gè)骰子為D6),6個(gè)面耻台,每個(gè)面(1空免,2,3盆耽,4蹋砚,5,6)出現(xiàn)的概率是1/6摄杂。第二個(gè)骰子是個(gè)四面體(稱這個(gè)骰子為D4)坝咐,每個(gè)面(1,2析恢,3墨坚,4)出現(xiàn)的概率是1/4。第三個(gè)骰子有八個(gè)面(稱這個(gè)骰子為D8)氮昧,每個(gè)面(1框杜,2浦楣,3,4咪辱,5振劳,6,7油狂,8)出現(xiàn)的概率是1/8历恐。
假設(shè)我們開始擲骰子,我們先從三個(gè)骰子里挑一個(gè)专筷,挑到每一個(gè)骰子的概率都是1/3弱贼。然后我們擲骰子,得到一個(gè)數(shù)字磷蛹,1吮旅,2,3味咳,4庇勃,5,6槽驶,7责嚷,8中的一個(gè)。不停的重復(fù)上述過程掂铐,我們會(huì)得到一串?dāng)?shù)字罕拂,每個(gè)數(shù)字都是1,2全陨,3爆班,4,5,6趁猴,7,8中的一個(gè)。例如我們可能得到這么一串?dāng)?shù)字(擲骰子10次):1 6 3 5 2 7 3 5 2 4
這串?dāng)?shù)字叫做可見狀態(tài)鏈雕沉。但是在隱馬爾可夫模型中,我們不僅僅有這么一串可見狀態(tài)鏈施无,還有一串隱含狀態(tài)鏈梦碗。在這個(gè)例子里,這串隱含狀態(tài)鏈就是你用的骰子的序列医瘫。比如侣肄,隱含狀態(tài)鏈有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8
一般來說,HMM中說到的馬爾可夫鏈其實(shí)是指隱含狀態(tài)鏈醇份,因?yàn)殡[含狀態(tài)(骰子)之間存在轉(zhuǎn)換概率(transition probability)稼锅。在我們這個(gè)例子里吼具,D6的下一個(gè)狀態(tài)是D4,D6矩距,D8的概率都是1/3拗盒。D4,D8的下一個(gè)狀態(tài)是D4锥债,D6陡蝇,D8的轉(zhuǎn)換概率也都一樣是1/3。這樣設(shè)定是為了最開始容易說清楚哮肚,但是我們其實(shí)是可以隨意設(shè)定轉(zhuǎn)換概率的登夫。比如,我們可以這樣定義允趟,D6后面不能接D4恼策,D6后面是D6的概率是0.9,是D8的概率是0.1潮剪。這樣就是一個(gè)新的HMM戏蔑。
同樣的,盡管可見狀態(tài)之間沒有轉(zhuǎn)換概率鲁纠,但是隱含狀態(tài)和可見狀態(tài)之間有一個(gè)概率叫做輸出概率(emission probability)总棵。就我們的例子來說,六面骰(D6)產(chǎn)生1的輸出概率是1/6改含。產(chǎn)生2情龄,3,4捍壤,5骤视,6的概率也都是1/6。我們同樣可以對(duì)輸出概率進(jìn)行其他定義鹃觉。比如专酗,我有一個(gè)被賭場(chǎng)動(dòng)過手腳的六面骰子,擲出來是1的概率更大盗扇,是1/2祷肯,擲出來是2,3疗隶,4佑笋,5,6的概率是1/10斑鼻。
其實(shí)對(duì)于HMM來說蒋纬,如果提前知道所有隱含狀態(tài)之間的轉(zhuǎn)換概率和所有隱含狀態(tài)到所有可見狀態(tài)之間的輸出概率,做模擬是相當(dāng)容易的。但是應(yīng)用HMM模型時(shí)候呢蜀备,往往是缺失了一部分信息的关摇,有時(shí)候你知道骰子有幾種,每種骰子是什么碾阁,但是不知道擲出來的骰子序列拒垃;有時(shí)候你只是看到了很多次擲骰子的結(jié)果,剩下的什么都不知道瓷蛙。如果應(yīng)用算法去估計(jì)這些缺失的信息悼瓮,就成了一個(gè)很重要的問題。這些算法我會(huì)在下面詳細(xì)講艰猬。
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
如果你只想看一個(gè)簡(jiǎn)單易懂的例子横堡,就不需要往下看了。
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
說兩句廢話冠桃,答主認(rèn)為呢命贴,要了解一個(gè)算法,要做到以下兩點(diǎn):會(huì)其意食听,知其形胸蛛。答主回答的,其實(shí)主要是第一點(diǎn)樱报。但是這一點(diǎn)呢葬项,恰恰是最重要,而且很多書上不會(huì)講的迹蛤。正如你在追一個(gè)姑娘民珍,姑娘對(duì)你說“你什么都沒做錯(cuò)!”你要是只看姑娘的表達(dá)形式呢盗飒,認(rèn)為自己什么都沒做錯(cuò)嚷量,顯然就理解錯(cuò)了。你要理會(huì)姑娘的意思逆趣,“你趕緊給我道歉蝶溶!”這樣當(dāng)你看到對(duì)應(yīng)的表達(dá)形式呢,趕緊認(rèn)錯(cuò)宣渗,跪地求饒就對(duì)了抖所。數(shù)學(xué)也是一樣,你要是不理解意思落包,光看公式部蛇,往往一頭霧水。不過呢咐蝇,數(shù)學(xué)的表達(dá)頂多也就是晦澀了點(diǎn),姑娘的表達(dá)呢,有的時(shí)候就完全和本意相反有序。所以答主一直認(rèn)為理解姑娘比理解數(shù)學(xué)難多了抹腿。
回到正題,和HMM模型相關(guān)的算法主要分為三類旭寿,分別解決三種問題:
1)知道骰子有幾種(隱含狀態(tài)數(shù)量)警绩,每種骰子是什么(轉(zhuǎn)換概率),根據(jù)擲骰子擲出的結(jié)果(可見狀態(tài)鏈)盅称,我想知道每次擲出來的都是哪種骰子(隱含狀態(tài)鏈)肩祥。
這個(gè)問題呢,在語音識(shí)別領(lǐng)域呢缩膝,叫做解碼問題混狠。這個(gè)問題其實(shí)有兩種解法,會(huì)給出兩個(gè)不同的答案疾层。每個(gè)答案都對(duì)将饺,只不過這些答案的意義不一樣。第一種解法求最大似然狀態(tài)路徑痛黎,說通俗點(diǎn)呢予弧,就是我求一串骰子序列,這串骰子序列產(chǎn)生觀測(cè)結(jié)果的概率最大湖饱。第二種解法呢掖蛤,就不是求一組骰子序列了,而是求每次擲出的骰子分別是某種骰子的概率井厌。比如說我看到結(jié)果后坠七,我可以求得第一次擲骰子是D4的概率是0.5,D6的概率是0.3旗笔,D8的概率是0.2.第一種解法我會(huì)在下面說到彪置,但是第二種解法我就不寫在這里了,如果大家有興趣蝇恶,我們另開一個(gè)問題繼續(xù)寫吧拳魁。
2)還是知道骰子有幾種(隱含狀態(tài)數(shù)量),每種骰子是什么(轉(zhuǎn)換概率)撮弧,根據(jù)擲骰子擲出的結(jié)果(可見狀態(tài)鏈)潘懊,我想知道擲出這個(gè)結(jié)果的概率。
看似這個(gè)問題意義不大贿衍,因?yàn)槟銛S出來的結(jié)果很多時(shí)候都對(duì)應(yīng)了一個(gè)比較大的概率授舟。問這個(gè)問題的目的呢,其實(shí)是檢測(cè)觀察到的結(jié)果和已知的模型是否吻合贸辈。如果很多次結(jié)果都對(duì)應(yīng)了比較小的概率释树,那么就說明我們已知的模型很有可能是錯(cuò)的,有人偷偷把我們的骰子給換了。
3)知道骰子有幾種(隱含狀態(tài)數(shù)量)奢啥,不知道每種骰子是什么(轉(zhuǎn)換概率)秸仙,觀測(cè)到很多次擲骰子的結(jié)果(可見狀態(tài)鏈),我想反推出每種骰子是什么(轉(zhuǎn)換概率)桩盲。
這個(gè)問題很重要寂纪,因?yàn)檫@是最常見的情況。很多時(shí)候我們只有可見結(jié)果赌结,不知道HMM模型里的參數(shù)捞蛋,我們需要從可見結(jié)果估計(jì)出這些參數(shù),這是建模的一個(gè)必要步驟柬姚。
問題闡述完了拟杉,下面就開始說解法。(0號(hào)問題在上面沒有提伤靠,只是作為解決上述問題的一個(gè)輔助)
0.一個(gè)簡(jiǎn)單問題
其實(shí)這個(gè)問題實(shí)用價(jià)值不高捣域。由于對(duì)下面較難的問題有幫助,所以先在這里提一下宴合。
知道骰子有幾種焕梅,每種骰子是什么,每次擲的都是什么骰子卦洽,根據(jù)擲骰子擲出的結(jié)果贞言,求產(chǎn)生這個(gè)結(jié)果的概率。
解法無非就是概率相乘:
解法無非就是概率相乘:
1.看見不可見的阀蒂,破解骰子序列
這里我說的是第一種解法该窗,解最大似然路徑問題。
舉例來說蚤霞,我知道我有三個(gè)骰子酗失,六面骰,四面骰昧绣,八面骰规肴。我也知道我擲了十次的結(jié)果(1 6 3 5 2 7 3 5 2 4),我不知道每次用了那種骰子夜畴,我想知道最有可能的骰子序列拖刃。
其實(shí)最簡(jiǎn)單而暴力的方法就是窮舉所有可能的骰子序列,然后依照第零個(gè)問題的解法把每個(gè)序列對(duì)應(yīng)的概率算出來贪绘。然后我們從里面把對(duì)應(yīng)最大概率的序列挑出來就行了兑牡。如果馬爾可夫鏈不長(zhǎng),當(dāng)然可行税灌。如果長(zhǎng)的話均函,窮舉的數(shù)量太大亿虽,就很難完成了。
另外一種很有名的算法叫做Viterbi algorithm. 要理解這個(gè)算法边酒,我們先看幾個(gè)簡(jiǎn)單的列子经柴。
首先狸窘,如果我們只擲一次骰子:
看到結(jié)果為1.對(duì)應(yīng)的最大概率骰子序列就是D4墩朦,因?yàn)镈4產(chǎn)生1的概率是1/4,高于1/6和1/8.
把這個(gè)情況拓展翻擒,我們擲兩次骰子:
氓涣、
結(jié)果為1,6.這時(shí)問題變得復(fù)雜起來陋气,我們要計(jì)算三個(gè)值劳吠,分別是第二個(gè)骰子是D6,D4巩趁,D8的最大概率痒玩。顯然,要取到最大概率议慰,第一個(gè)骰子必須為D4蠢古。這時(shí),第二個(gè)骰子取到D6的最大概率是
同樣的别凹,我們可以計(jì)算第二個(gè)骰子是D4或D8時(shí)的最大概率草讶。我們發(fā)現(xiàn),第二個(gè)骰子取到D6的概率最大炉菲。而使這個(gè)概率最大時(shí)堕战,第一個(gè)骰子為D4。所以最大概率骰子序列就是D4 D6拍霜。
繼續(xù)拓展嘱丢,我們擲三次骰子:
同樣,我們計(jì)算第三個(gè)骰子分別是D6祠饺,D4越驻,D8的最大概率。我們?cè)俅伟l(fā)現(xiàn)吠裆,要取到最大概率伐谈,第二個(gè)骰子必須為D6。這時(shí)试疙,第三個(gè)骰子取到D4的最大概率是
同上诵棵,我們可以計(jì)算第三個(gè)骰子是D6或D8時(shí)的最大概率。我們發(fā)現(xiàn)祝旷,第三個(gè)骰子取到D4的概率最大履澳。而使這個(gè)概率最大時(shí)嘶窄,第二個(gè)骰子為D6,第一個(gè)骰子為D4距贷。所以最大概率骰子序列就是D4 D6 D4柄冲。
寫到這里,大家應(yīng)該看出點(diǎn)規(guī)律了忠蝗。既然擲骰子一二三次可以算现横,擲多少次都可以以此類推。我們發(fā)現(xiàn)阁最,我們要求最大概率骰子序列時(shí)要做這么幾件事情戒祠。首先,不管序列多長(zhǎng)速种,要從序列長(zhǎng)度為1算起姜盈,算序列長(zhǎng)度為1時(shí)取到每個(gè)骰子的最大概率。然后配阵,逐漸增加長(zhǎng)度馏颂,每增加一次長(zhǎng)度,重新算一遍在這個(gè)長(zhǎng)度下最后一個(gè)位置取到每個(gè)骰子的最大概率棋傍。因?yàn)樯弦粋€(gè)長(zhǎng)度下的取到每個(gè)骰子的最大概率都算過了救拉,重新計(jì)算的話其實(shí)不難。當(dāng)我們算到最后一位時(shí)舍沙,就知道最后一位是哪個(gè)骰子的概率最大了近上。然后,我們要把對(duì)應(yīng)這個(gè)最大概率的序列從后往前推出來拂铡。
2.誰動(dòng)了我的骰子壹无?
比如說你懷疑自己的六面骰被賭場(chǎng)動(dòng)過手腳了,有可能被換成另一種六面骰感帅,這種六面骰擲出來是1的概率更大斗锭,是1/2,擲出來是2失球,3岖是,4,5实苞,6的概率是1/10豺撑。你怎么辦么?答案很簡(jiǎn)單黔牵,算一算正常的三個(gè)骰子擲出一段序列的概率聪轿,再算一算不正常的六面骰和另外兩個(gè)正常骰子擲出這段序列的概率。如果前者比后者小猾浦,你就要小心了陆错。
比如說擲骰子的結(jié)果是:
要算用正常的三個(gè)骰子擲出這個(gè)結(jié)果的概率灯抛,其實(shí)就是將所有可能情況的概率進(jìn)行加和計(jì)算。同樣音瓷,簡(jiǎn)單而暴力的方法就是把窮舉所有的骰子序列对嚼,還是計(jì)算每個(gè)骰子序列對(duì)應(yīng)的概率,但是這回绳慎,我們不挑最大值了纵竖,而是把所有算出來的概率相加,得到的總概率就是我們要求的結(jié)果偷线。這個(gè)方法依然不能應(yīng)用于太長(zhǎng)的骰子序列(馬爾可夫鏈)磨确。
我們會(huì)應(yīng)用一個(gè)和前一個(gè)問題類似的解法沽甥,只不過前一個(gè)問題關(guān)心的是概率最大值声邦,這個(gè)問題關(guān)心的是概率之和。解決這個(gè)問題的算法叫做前向算法(forward algorithm)摆舟。
首先亥曹,如果我們只擲一次骰子:
看到結(jié)果為1.產(chǎn)生這個(gè)結(jié)果的總概率可以按照如下計(jì)算,總概率為0.18:
把這個(gè)情況拓展恨诱,我們擲兩次骰子:
看到結(jié)果為1媳瞪,6.產(chǎn)生這個(gè)結(jié)果的總概率可以按照如下計(jì)算,總概率為0.05:
繼續(xù)拓展照宝,我們擲三次骰子:
看到結(jié)果為1蛇受,6,3.產(chǎn)生這個(gè)結(jié)果的總概率可以按照如下計(jì)算厕鹃,總概率為0.03:
同樣的兢仰,我們一步一步的算,有多長(zhǎng)算多長(zhǎng)剂碴,再長(zhǎng)的馬爾可夫鏈總能算出來的把将。用同樣的方法,也可以算出不正常的六面骰和另外兩個(gè)正常骰子擲出這段序列的概率忆矛,然后我們比較一下這兩個(gè)概率大小察蹲,就能知道你的骰子是不是被人換了。
3.擲一串骰子出來催训,讓我猜猜你是誰
(答主很懶洽议,還沒寫,會(huì)寫一下EM這個(gè)號(hào)稱算法的方法)
上述算法呢漫拭,其實(shí)用到了遞歸亚兄,逆向推導(dǎo),循環(huán)這些方法嫂侍,我只不過用很直白的語言寫出來了儿捧。如果你們?nèi)タ磳I(yè)書籍呢荚坞,會(huì)發(fā)現(xiàn)更加嚴(yán)謹(jǐn)和專業(yè)的描述。畢竟菲盾,我只做了會(huì)其意颓影,要知其形,還是要看書的懒鉴。