隱馬爾科夫模型(HMM)

HMM簡介

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

MATLAB示例程序

%% 隱馬爾科夫模型
%% 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);
相關文章
相關標籤/搜索