此文講述的內(nèi)容在Matlab 7.0、7.5(R2007b)中均有——馬爾可夫工具箱,主要內(nèi)容如下。
簡(jiǎn)介:馬爾可夫處理是隨機(jī)處理的一個(gè)典型例子——此種處理根據(jù)特定的概率產(chǎn)生隨機(jī)輸出或狀態(tài)序列。馬爾可夫處理的特別之處在于它的無(wú)記憶性——他的下一個(gè)狀態(tài)僅依賴他的當(dāng)前狀態(tài),不考慮導(dǎo)致他們的歷史。馬爾可夫處理的模型在實(shí)際應(yīng)用中使用非常廣泛,從每日股票價(jià)格到染色體中的基因位置都有應(yīng)用。
馬爾可夫鏈
馬爾可夫模型用狀態(tài)圖可視化描述如下。
MarkovModel.jpg
在圖中,矩形代表你要描述的模型在處理中可能出現(xiàn)的狀態(tài),箭頭描述了狀態(tài)之間的轉(zhuǎn)換。每個(gè)箭頭上的標(biāo)簽表明了該轉(zhuǎn)換出現(xiàn)的概率。在處理的每一步,模型都可能根據(jù)當(dāng)前狀態(tài)產(chǎn)生一種output或emission,然后做一個(gè)到另一狀態(tài)的轉(zhuǎn)換。馬爾可夫模型的一個(gè)重要特點(diǎn)是:他的下個(gè)狀態(tài)僅僅依賴當(dāng)前狀態(tài),而與導(dǎo)致其成為當(dāng)前狀態(tài)的歷史變換無(wú)關(guān)。
馬爾可夫鏈?zhǔn)邱R爾可夫模型的一組離散狀態(tài)集合的數(shù)學(xué)描述形式。馬爾可夫鏈特征歸納如下:
1. 一個(gè)狀態(tài)的集合{1, 2, ..., M}
2. 一個(gè)M * M的轉(zhuǎn)移矩陣T,(i, j)位置的數(shù)據(jù)是從狀態(tài)i轉(zhuǎn)到狀態(tài)j的概率。T的每一行值的和必然是1,因?yàn)檫@是從一個(gè)給定狀態(tài)轉(zhuǎn)移到其他所有可能狀態(tài)的概率之和。
3. 一個(gè)可能的輸出(output)或發(fā)布(emissions)的集合{S1, S2, ..., SN}。默認(rèn)情況下,發(fā)布的集合是{1, 2, ..., N},這里N是可能的發(fā)布的個(gè)數(shù),當(dāng)然,你也可以選擇一個(gè)不同的數(shù)字或符號(hào)的集合。
4. 一個(gè)M * N的發(fā)布矩陣E,(i, k)入口給出了從狀態(tài)i得到發(fā)布的標(biāo)志Sk的概率。
馬爾可夫鏈在第0步,從一個(gè)初始狀態(tài)i0開(kāi)始。接著,此鏈按照T(1, i1)概率轉(zhuǎn)移到狀態(tài)i1,且按概率E(i1, k1)概率發(fā)布一個(gè)輸出S(k1)。因此,在前r步,狀態(tài)序列(i1, i2, i3, ..., ir)和發(fā)布序列(Sk1, Sk2, ..., Skr)的可能的觀測(cè)結(jié)果是
T(1, i1)E(i, k1), T(i1, i2)E(i2, k2), ..., T(ir-1, ir)E(ir, k)
隱馬爾可夫模型簡(jiǎn)介:隱馬爾可夫模型相對(duì)馬爾可夫模型的不同之處在于,你觀測(cè)到一組發(fā)布序列,但是卻不知道模型通過(guò)什么樣的狀態(tài)序列得到這樣的發(fā)布。隱馬爾可夫模型分析就是要從觀測(cè)數(shù)據(jù)恢復(fù)出這一狀態(tài)序列。
一個(gè)例子:考慮一個(gè)擁有2個(gè)狀態(tài)和6個(gè)位置發(fā)布的馬爾可夫模型。模型描述如下:
1. 一個(gè)紅色骰子,有5個(gè)面,標(biāo)記為1到6。
2. 一個(gè)綠色骰子,有12個(gè)面,有5個(gè)標(biāo)記為2到6,余下的全標(biāo)記為1。
3. 一個(gè)加權(quán)的紅硬幣,正面的概率是0.9,背面的概率是0.1。
4. 一個(gè)加權(quán)的綠硬幣,正面的概率為0.95,背面的概率為0.05。
這個(gè)模型按照下面的規(guī)則從集合{1, 2, 3, 4, 5, 6}產(chǎn)生一個(gè)數(shù)字序列:
1. 從滾動(dòng)紅骰子開(kāi)始,記下出現(xiàn)的數(shù)字,作為發(fā)布結(jié)果。
2. 投紅硬幣:
如果結(jié)果是正面,滾動(dòng)紅骰子,記下結(jié)果;
如果結(jié)果是背面,滾動(dòng)綠骰子,記下結(jié)果。
3. 在下面的每一步,你都拋和前一步所投骰子相同顏色的硬幣。如果硬幣出現(xiàn)正面,滾和硬幣相同顏色的骰子。如果硬幣出現(xiàn)反面,改為投另種顏色的骰子。
這個(gè)模型的狀態(tài)圖如下,有兩個(gè)狀態(tài),紅和綠:
HiddenMarkovModels.jpg
通過(guò)投擲和狀態(tài)一樣顏色的骰子來(lái)解決輸出(發(fā)布),通過(guò)拋同樣顏色的硬幣來(lái)決定狀態(tài)的轉(zhuǎn)移。
狀態(tài)轉(zhuǎn)移概率矩陣為:
>> T = [0.9 0.1; 0.05 0.95]
T =
0.9000 0.1000
0.0500 0.9500
輸出或發(fā)布概率矩陣為:
>> E = [1/6 1/6 1/6 1/6 1/6 1/6; 7/12 1/12 1/12 1/12 1/12 1/12]
E =
0.1667 0.1667 0.1667 0.1667 0.1667 0.1667
0.5833 0.0833 0.0833 0.0833 0.0833 0.0833
這個(gè)模型并不是隱藏的,因?yàn)槲覀儚挠矌藕枉蛔拥念伾呀?jīng)知道狀態(tài)序列。假設(shè),有其他人產(chǎn)生了一個(gè)發(fā)布結(jié)果,而沒(méi)有向你展示硬幣和骰子,你能看到的只有結(jié)果。當(dāng)你看到1比其他數(shù)字多時(shí),你也許猜測(cè)這個(gè)模型是在綠色狀態(tài),但是因?yàn)槟悴荒芸吹奖煌恩蛔拥念伾?,所以你并不能確定。
隱馬爾可夫模型提出了如下問(wèn)題:
1. 給定一個(gè)輸出序列,最有可能的狀態(tài)過(guò)程是什么?
2. 給定一個(gè)輸出序列,如何估計(jì)模型的轉(zhuǎn)移和發(fā)布概率?
3. 如何求這個(gè)模型產(chǎn)生一個(gè)給定序列的先驗(yàn)概率?
4. 如何求這個(gè)模型產(chǎn)生一個(gè)給定序列的后驗(yàn)概率?
隱馬爾可夫模型分析統(tǒng)計(jì)工具箱包含5個(gè)與隱馬爾可夫模型相關(guān)的函數(shù):
hmmgenerate 從一個(gè)馬爾可夫模型產(chǎn)生一個(gè)狀態(tài)序列和輸出序列;
hmmestimate 計(jì)算轉(zhuǎn)移和輸出的極大似然估計(jì);
hmmtrain 從一個(gè)輸出序列計(jì)算轉(zhuǎn)移和輸出概率的極大似然估計(jì);
hmmviterbi 計(jì)算一個(gè)隱馬爾可夫模型最可能的狀態(tài)變化過(guò)程;
hmmdecode 計(jì)算一個(gè)給定輸出序列的后驗(yàn)狀態(tài)概率。
下面部分介紹如何使用這些函數(shù)來(lái)分析隱馬爾可夫模型。
1. 產(chǎn)生一個(gè)測(cè)試序列
下面代碼產(chǎn)生上面簡(jiǎn)介中模型的轉(zhuǎn)移和輸出矩陣:
TRANS = [.9 .1; .05 .95;];
EMIS = [1/6, 1/6, 1/6, 1/6, 1/6, 1/6;...
7/12, 1/12, 1/12, 1/12, 1/12, 1/12];
要從模型產(chǎn)生一個(gè)隨機(jī)的狀態(tài)序列和輸出序列,使用hmmgenerate:
[seq,states] = hmmgenerate(1000,TRANS,EMIS);
輸出中,seq是輸出序列,states是狀態(tài)序列。hmmgenerate在第0步從狀態(tài)1開(kāi)始,在第一步轉(zhuǎn)移到狀態(tài)i1
,并返回i1作為狀態(tài)的第一個(gè)入口。
2. 估計(jì)狀態(tài)序列
給定了轉(zhuǎn)移和輸出矩陣TRANS和EMIS,函數(shù)hmmviterbi使用Viterbi算法計(jì)算模型給定輸出序列seq最有可能
通過(guò)的狀態(tài)序列:
likelystates = hmmviterbi(seq, TRANS, EMIS);
likelystates是和seq一樣長(zhǎng)的序列。計(jì)算hmmvertibi的精度如下:
sum(states == likelystates) / length(states)
ans =
0.8680
3. 估計(jì)轉(zhuǎn)移和輸出矩陣
函數(shù)hmmestimate和hmmtrain用于估計(jì)給定輸出序列seq的轉(zhuǎn)移和輸出矩陣TRANS和EMIS。
使用hmmestimate
[TRANS_EST, EMIS_EST] = hmmestimate(seq, states)
TRANS_EST =
0.9065 0.0935
0.0406 0.9594
EMIS_EST =
0.1452 0.1516 0.1581 0.1968 0.1581 0.1903
0.5841 0.0754 0.0986 0.0812 0.0841 0.0768
由上面使用方式可知,hmmestimate函數(shù)需要事先知道了得到輸出序列seq,以及得到此結(jié)果的狀態(tài)變化序
列。
使用hmmtrain
如果不知道狀態(tài)序列,但是知道TRANS和EMIS的初始猜測(cè),那就可以使用hmmtrain來(lái)估計(jì)TRANS和EMIS。
假設(shè)已知如下初始猜測(cè):
TRANS_GUESS = [.85 .15; .1 .9];
EMIS_GUESS = [.17 .16 .17 .16 .17 .17;.6 .08 .08 .08 .08 08];
TRANS和EMIS的估計(jì)如下:
[TRANS_EST2, EMIS_EST2] = hmmtrain(seq, TRANS_GUESS, EMIS_GUESS)
TRANS_EST2 =
0.9207 0.0793
0.0370 0.9630
EMIS_EST2 =
0.1792 0.1437 0.1436 0.1855 0.1509 0.1971
0.5774 0.0775 0.1042 0.0840 0.0859 0.0710
hmmtrain使用迭代算法來(lái)不斷修改TRANS_GUESS和EMIS_GUESS,使得每一步修改得到的矩陣都更加可能產(chǎn)生觀測(cè)序列seq。當(dāng)前后兩個(gè)兩次迭代矩陣的變化在一個(gè)小的容錯(cuò)范圍內(nèi)時(shí),迭代停止。如果算法無(wú)法達(dá)到容錯(cuò)的范圍,則迭代到達(dá)一定次數(shù)時(shí)就會(huì)停止,并返回一個(gè)警告提示。默認(rèn)的最大迭代次數(shù)為100。
如果算法達(dá)不到目標(biāo)誤差范圍,則可以通過(guò)增加迭代次數(shù)和/或加大容錯(cuò)誤差值來(lái)使其獲得較合適結(jié)果:
改變迭代次數(shù)maxiter:hmmtrain(seq,TRANS_GUESS,EMIS_GUESS,'maxiterations',maxiter)
改變?nèi)蒎e(cuò)誤差tol:hmmtrain(seq, TRANS_GUESS, EMIS_GUESS, 'tolerance', tol)
影響hmmtrain輸出的矩陣可靠性的兩點(diǎn)因素:
(1)算法收斂于局部極值,這點(diǎn)可以使用不同的初始猜測(cè)矩陣來(lái)嘗試解決;
(2)序列seq太短而無(wú)法很好的訓(xùn)練矩陣,可以嘗試使用較長(zhǎng)的序列。
4. 估計(jì)后驗(yàn)狀態(tài)概率(不太理解)
一個(gè)輸出序列seq的后驗(yàn)狀態(tài)概率是在特定狀態(tài)下的模型產(chǎn)生在seq中一個(gè)輸出的條件概率。假定seq已經(jīng)給出,你可以使用hmmdecode得到后驗(yàn)狀態(tài)概率。
PSTATES = hmmdecode(seq,TRANS,EMIS)
輸出為一個(gè)M * N的矩陣。M是狀態(tài)的個(gè)數(shù),L是seq的長(zhǎng)度。PSTATES(i, j)是模型在狀態(tài)i時(shí),產(chǎn)生seq第j個(gè)輸出的條件概率。
參考文獻(xiàn):
[1] Matlab R2007b幫助文檔,
http://www.aiseminar.cn/bbs,jink2005簡(jiǎn)譯!