HMM用於研究非肯定性生成模式,HMM是一個與時間無關的模型(有待改進),而且n階HMM模型是指下一個狀態只與前n個有關,一般只研究一階HMM模型(有待改進)。從可觀察的參數中肯定該過程的隱含參數,而後利用這些參數來做進一步的分析,例如模式識別。python
下面可使用一個案例來解釋HMM模型。算法
假設有三種色子,分別是標有123456的立方體、標有1234的三菱錐、標有12345678的八面體。它們分別記爲D六、D四、D8,假設咱們從三個色子中任意挑一個色子的機率爲1/3,而後咱們能夠隨意擲色子,假設某一次擲色子結果爲136527481。這個結果稱爲可見狀態鏈,其中所擲色子的序列爲隱含狀態鏈,HMM通常指的是隱含狀態鏈。隱含狀態鏈之間存在着轉移機率,在這個例子中,隱含狀態鏈有多是D4D6D6D8D4D8D6D8D4,也有多是其餘隱含狀態鏈,能夠枚舉不少種。可見狀態之間沒有轉移機率,可是隱含層與可見層之間有轉移機率,例如D4中擲1/2/3/4的機率均爲1/4。固然也能夠對兩個轉移機率進行自定義。spa
應用HMM模型的時候,每每是缺失了一部分信息的,知道骰子有幾種,每種骰子是什麼,可是不知道擲出來的骰子序列;有時候只是看到了不少次擲骰子的結果,剩下的什麼都不知道。和HMM模型相關的算法主要分爲三類,分別解決三種問題:code
知道骰子有幾種(隱含狀態數量),每種骰子是什麼(轉換機率),根據擲骰子擲出的結果(可見狀態鏈),我想知道每次擲出來的都是哪一種骰子(隱含狀態鏈)。遊戲
知道骰子有幾種(隱含狀態數量),每種骰子是什麼(轉換機率),根據擲骰子擲出的結果(可見狀態鏈),我想知道擲出這個結果的機率。it
知道骰子有幾種(隱含狀態數量),不知道每種骰子是什麼(轉換機率),觀測到不少次擲骰子的結果(可見狀態鏈),我想反推出每種骰子是什麼(轉換機率)。class
%% 隱馬爾科夫模型 %% 2015-9-16,zzw %% 問題背景介紹 % 考慮兩個色子和兩個硬幣,紅色子和綠色子,紅硬幣和綠硬幣。 % 其中紅色子1~6出現的機率相同 % 綠色子有12個面,其中1出如今7個面上,其他五個面分別標2~6 % 紅硬幣出現正面向上的機率爲0.9,反面的機率爲0.1 % 綠硬幣出現正面向上的機率爲0.95,反面的機率爲0.05 %% 遊戲規則 % 擲紅色色子,記下數字 % 拋紅色硬幣,若正面向上,則繼續擲紅色子;反之,則拋綠色子 % 繼續上面的過程 %% 產生數據 % 狀態轉移機率矩陣,第一行表明紅色硬幣,第二行表明綠色硬幣 T=[0.9 0.1;0.05 0.95]; % 兩個色子分別產生每一個數字的機率,第一行表明紅色色子,第二行表明綠色色子 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]; % 隨機產生一組色子序列和狀態序列 [seq,states]=hmmgenerate(1000,T,E); %% 採用viterbi算法來推算狀態序列 likelystates=hmmviterbi(seq,T,E); % 算出正確率 rate=sum(states==likelystates)/1000; %% 經過序列和狀態來推測轉移機率和色子機率 [T_EST,E_EST]=hmmestimate(seq,states); %% 若是不知道狀態states,僅經過seq和一個初始的T_EST,E_EST來估計T和E也能夠的 T_GUESS=[0.85 0.15;0.1 0.9]; E_GUESS=[0.17 0.16 0.17 0.16 0.17 0.17;0.6 0.08 0.08 0.08 0.08 0.08]; [T_EST2,E_EST2]=hmmtrain(seq,T_GUESS,E_GUESS); %% 估計先驗條件分佈,即產生這個結果的機率 PSTATES=hmmdecode(seq,T,E);