隐马尔科夫模型(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);
相关文章
相关标签/搜索