码迷,mamicode.com
首页 > 其他好文 > 详细

隐马尔科夫模型(HMM)

时间:2015-09-16 22:03:45      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

HMM简介

HMM用于研究非确定性生成模式,HMM是一个与时间无关的模型(有待改进),并且n阶HMM模型是指下一个状态只与前n个有关,通常只研究一阶HMM模型(有待改进)。从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析,例如模式识别。

下面可以使用一个案例来解释HMM模型。

技术分享

假设有三种色子,分别是标有123456的立方体、标有1234的三菱锥、标有12345678的八面体。它们分别记为D6、D4、D8,假设我们从三个色子中任意挑一个色子的概率为1/3,然后我们可以随意掷色子,假设某一次掷色子结果为136527481。这个结果称为可见状态链,其中所掷色子的序列为隐含状态链,HMM一般指的是隐含状态链。隐含状态链之间存在着转移概率,在这个例子中,隐含状态链有可能是D4D6D6D8D4D8D6D8D4,也有可能是其他隐含状态链,可以枚举很多种。可见状态之间没有转移概率,但是隐含层与可见层之间有转移概率,例如D4中掷1/2/3/4的概率均为1/4。当然也可以对两个转移概率进行自定义。

应用HMM模型的时候,往往是缺失了一部分信息的,知道骰子有几种,每种骰子是什么,但是不知道掷出来的骰子序列;有时候只是看到了很多次掷骰子的结果,剩下的什么都不知道。和HMM模型相关的算法主要分为三类,分别解决三种问题:

知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道每次掷出来的都是哪种骰子(隐含状态链)。

知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道掷出这个结果的概率。

知道骰子有几种(隐含状态数量),不知道每种骰子是什么(转换概率),观测到很多次掷骰子的结果(可见状态链),我想反推出每种骰子是什么(转换概率)。

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);


隐马尔科夫模型(HMM)

标签:

原文地址:http://my.oschina.net/zzw922cn/blog/507017

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!