隐马尔科夫matlab工具箱.docx
《隐马尔科夫matlab工具箱.docx》由会员分享,可在线阅读,更多相关《隐马尔科夫matlab工具箱.docx(17页珍藏版)》请在冰豆网上搜索。
隐马尔科夫matlab工具箱
隐马尔可夫模型简介以matlab应用分析
摘要:
隐马尔可夫模型(HiddenMarkovModel,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程;是序列数据处理和统计学习的重要模型。
其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数来作进一步的分析。
本论文首先从隐马尔可夫模型基本理论和模型的表达式出发,系统的介绍了引马尔科夫模型和算法原理,并结合两个版本的MATLAB算法,对具体问题进行验证求解,并分析比较算法的结果。
关键词:
隐马尔可夫模型、matlabtoolbox、实验测试
一、引言
隐马尔可夫模型(HiddenMarkovModel,HMM)作为一种统计分析模型,创立于20世纪70年代。
80年代得到了传播和发展,成为信号处理的一个重要方向,现已成功地用于语音识别,行为识别,文字识别以及故障诊断等领域。
隐马尔可夫模型是马尔可夫链的一种,它的状态不能直接观察到,但能通过观测向量序列观察到,每个观测向量都是通过某些概率密度分布表现为各种状态,每一个观测向量是由一个具有相应概率密度分布的状态序列产生,详见文献[1]。
所以,隐马尔可夫模型是一个双重随机过程----具有一定状态数的隐马尔可夫链和显示随机函数集。
自20世纪80年代以来,HMM被应用于语音识别,取得重大成功。
到了90年代,HMM还被引入计算机文字识别和移动通信核心技术“多用户的检测”。
近年来,HMM在生物信息科学、故障诊断等领域也开始得到应用。
二、生成模型
我们通常都习惯寻找一个事物在一段时间里的变化模式(规律)。
这些模式发生在很多领域,比如计算机中的指令序列,句子中的词语顺序和口语单词中的音素序列等等,事实上任何领域中的一系列事件都有可能产生有用的模式。
详见文献[3]
考虑一个简单的例子,有人试图通过一片海藻推断天气——民间传说告诉我们‘湿透的’海藻意味着潮湿阴雨,而‘干燥的’海藻则意味着阳光灿烂。
如果它处于一个中间状态(‘有湿气’),我们就无法确定天气如何。
然而,天气的状态并没有受限于海藻的状态,所以我们可以在观察的基础上预测天气是雨天或晴天的可能性。
另一个有用的线索是前一天的天气状态(或者,至少是它的可能状态)——通过综合昨天的天气及相应观察到的海藻状态,我们有可能更好的预测今天的天气。
2.1确定性模型(DeterministicPatterns)
一个由完全肯定的函数关系(因果关系)所决定的模型。
确定性模型是指不包含任何随机成份的模型。
对于确定性模型,只要设定了输入和各个输入之间的关系,其输出也是确定的,而与实验次数无关。
确定性模型事实上是一种简化了的随机性模型。
考虑一套交通信号灯,灯的颜色变化序列依次是红色-红色/黄色-绿色-黄色-红色。
这个序列可以作为一个状态机器,交通信号灯的不同状态都紧跟着上一个状态。
注意每一个状态都是唯一的依赖于前一个状态,所以,如果交通灯为绿色,那么下一个颜色状态将始终是黄色——也就是说,该系统是确定性的。
确定性系统相对比较容易理解和分析,因为状态间的转移是完全已知的。
2.2非确定性模式(Non-deterministicpatterns)
由于包含随机因素等不确定成分在内;模型不能够一个确定的关系来确定,模型的结果具有不确定性的模式成为非确定性模式。
将第一章中天气的例子,加入第三个状态——多云。
现在又三种天气状态晴天,小雨和多云。
与交通信号灯例子不同,由于天气的随机性,我们仅仅依据前一天的天气,并不能下一天的天气状态,也就是说三个天气之间的变化模型是不确定的。
由于系统是非确定性的,系统状态之间的转移具有很大的不确定性。
三、模型简介
3.1马尔科夫过程[2]
马尔可夫过程 (MarkovProcess),它因俄罗斯数学家安德烈·马尔可夫而得名,代表数学中具有马尔可夫性质的离散随机过程。
该过程中,每个状态的转移只依赖于之前的
个状态,这个过程被称为1个
阶的模型,其中
是影响转移状态的数目。
最简单的马尔科夫过程就是一阶过程,每一个状态的转移只依赖于其之前的那一个状态。
这和确定性系统不一样,因为这种转移是有概率的,而不是确定性的。
马尔可夫链是随机变量
…,
的一个数列。
这些变量的范围,即他们所有可能取值的集合,被称为“状态空间”,而
的值则是在时间
的状态。
如果
对于过去状态的条件概率分布仅是
的一个函数,则
以晴天,小雨,多云为天气状态,如下图;天气例子中状态间所有可能的一阶状态转移情况:
注意一个含有
个状态的一阶过程有
个状态转移。
每一个转移的概率叫做状态转移概率 (statetransitionprobability),就是从一个状态转移到另一个状态的概率。
这所有的
个概率可以用一个状态转移矩阵来表示。
下面的状态转移矩阵显示的是天气例子中可能的状态转移概率:
矩阵表示,如果昨天是晴天;今天50%的可能是晴天,37.5%的概率是阴天,12.5%的概率会下雨,很明显,矩阵中每一行的和都是1。
为了初始化这样一个马尔科夫系统,我们需要一个初始的概率向量
:
这个向量
表示第一天是晴天。
所以一阶马尔科夫过程定义了以下三个部分:
1)状态:
晴天、阴天和下雨
2)初始向量:
定义系统在时间为0的时候的状态的概率
3)状态转移矩阵:
每种天气转换的概率
所有的能被这样描述的系统都是一个马尔科夫过程。
我们尝试识别时间变化中的模式,并且为了达到这个目我们试图对这个过程建模以便产生这样的模式。
我们使用了离散时间点、离散状态以及做了马尔科夫假设。
在采用了这些假设之后,系统产生了这个被描述为马尔科夫过程的模式,它包含了一个向量(初始概率)和一个状态转移矩阵。
关于假设,重要的一点是状态转移矩阵并不随时间的改变而改变——这个矩阵在整个系统的生命周期中是固定不变的。
3.2马尔科夫过程的局限
在某些情况下,我们希望找到的模式用马尔科夫过程描述还显得不充分。
例如上面提到的天气例子,一个隐士也许不能够直接获取到天气的观察情况,但是他有一些水藻。
民间传说告诉我们水藻的状态与天气状态有一定的概率关系——天气和水藻的状态是紧密相关的。
在这个例子中我们有两组状态,观察的状态(水藻的状态)和隐藏的状态(天气的状态)。
我们希望为隐士设计一种算法,在不能够直接观察天气的情况下,通过水藻和马尔科夫假设来预测天气。
需要着重指出的是,隐藏状态的数目与观察状态的数目可以是不同的。
一个包含三个状态的天气系统(晴天、多云、雨天)中,可以观察到4个等级的海藻湿润情况(干、稍干、潮湿、湿润)。
在这种情况下,观察到的状态序列与隐藏过程有一定的概率关系。
我们使用隐马尔科夫模型对这样的过程建模,这个模型包含了一个底层隐藏的随时间改变的马尔科夫过程,以及一个与隐藏状态某种程度相关的可观察到的状态集合。
3.3隐马尔科夫模型
隐马尔可夫模型 (HiddenMarkovModel)是一种统计模型,用来描述一个含有隐含未知参数的马尔可夫过程。
其难点是从可观察的参数中确定该过程的隐含参数,然后利用这些参数进行分析。
隐马尔可夫模型三个重要假设,尽管这些假设是不现实的:
假设1:
马尔可夫假设(状态构成一阶马尔可夫链)
假设2:
不动性假设(状态与具体时间无关)
假设3:
输出独立性假设(输出仅与当前状态有关)
隐藏的状态和可观察到的状态之间有一种概率上的关系,也就是说某种隐藏状态
被认为是某个可以观察的状态
是有概率的,假设为
。
如果可以观察的状态有3种,那么很显然
。
下图显示的是天气例子中的隐藏状态和观察状态。
假设隐藏状态(实际的天气)由一个简单的一阶马尔科夫过程描述,那么它们之间都相互连接。
隐藏状态和观察状态之间的连接表示:
在给定的马尔科夫过程中,一个特定的隐藏状态生成特定的观察状态的概率。
这很清晰的表示了‘进入’一个观察状态的所有概率之和为1,在上面这个例子中就是
之和
除了马尔科夫过程的概率关系,还有另一个矩阵混淆矩阵(confusionmatrix),它包含了给定一个隐藏状态后得到的观察状态的概率。
对于天气例子,混淆矩阵是:
我们已经看到在一些过程中一个观察序列与一个底层马尔科夫过程是概率相关的。
在这些例子中,观察状态的数目可以和隐藏状态的数码不同。
我们使用一个隐马尔科夫模型(HMM)建模,模型包含两组状态集合和三组概率集合
:
隐藏状态:
一个系统的(真实)状态,可以由一个马尔科夫过程进行描述(例如,天气)。
观察状态:
在这个过程中‘可视’的状态(例如,海藻的湿度)。
初始向量
:
包含(隐)模型在时间
时,一个特殊的隐藏状态的概率(初始概率)。
转移矩阵
:
包含了一个隐藏状态到另一个隐藏状态的概率
混淆矩阵
:
包含了给定隐马尔科夫模型的某一个特殊的隐藏状态,观察到的某个观察状态的概率。
因此一个隐马尔科夫模型是在一个标准的马尔科夫过程中引入一组观察状态,以及其与隐藏状态间的一些概率关系。
3.4隐马尔科夫模型应用
一旦一个系统可以作为HMM被描述,就可以用来解决三个基本问题。
其中前两个是模式识别问题:
给定HMM求一个观察序列的概率(评估);搜索最有可能生成一个观察序列的隐藏状态训练(解码)。
第三个问题是给定观察序列生成一个HMM(学习)。
1)评估(Evaluation)
考虑这样的问题,我们有一些描述不同系统的隐马尔科夫模型及一个观察序列。
我们想知道哪一个HMM最有可能产生了这个给定的观察序列。
例如,对于海藻来说,我们也许会有一个“夏季”模型和一个“冬季”模型,因为不同季节之间的情况是不同的——我们也许想根据海藻湿度的观察序列来确定当前的季节。
我们使用前向算法(forwardalgorithm)来计算给定隐马尔科夫模型(HMM)后的一个观察序列的概率,并因此选择最合适的隐马尔科夫模型(HMM)。
2)解码(Decoding)
给定观察序列搜索最可能的隐藏状态序列。
另一个相关问题,也是最感兴趣的一个,就是搜索生成输出序列的隐藏状态序列。
在许多情况下我们对于模型中的隐藏状态更感兴趣,因为它们代表了一些更有价值的东西,而这些东西通常不能直接观察到。
考虑海藻和天气这个例子,一个盲人隐士只能感觉到海藻的状态,但是他更想知道天气的情况,天气状态在这里就是隐藏状态。
我们使用Viterbi算法(Viterbialgorithm)确定(搜索)已知观察序列及HMM最可能的隐藏状态序列。
3)学习(Learning)
根据观察序列生成隐马尔科夫模型。
第三个问题,也是与HMM相关的问题中最难的,根据一个观察序列(来自于已知的集合),以及与其有关的一个隐藏状态集,估计一个最合适的隐马尔科夫模型(HMM),也就是确定对已知序列描述的最合适的
三元组。
当矩阵A和B不能够直接被(估计)测量时,前向-后向算法被用来进行学习(参数估计),这也是实际应用中常见的情况。
由一个向量和两个矩阵
描述的隐马尔科夫模型对于实际系统有着巨大的价值,虽然经常只是一种近似,但它们却是经得起分析的。
四、matlab隐马尔科夫工具箱翻译及应用[4]
4.1模型初始化
隐马尔可夫模型相对马尔可夫模型的不同之处在于,你观测到一组发布序列,但是却不知道模型通过什么样的状态序列得到这样的发布。
隐马尔可夫模型分析就是要从观测数据恢复出这一状态序列。
考虑一个拥有2个状态和6个位置发布的马尔可夫模型。
模型描述如下:
1.一个红色骰子,有6个面,标记为1到6。
2.一个绿色骰子,有12个面,有5个标记为2到6,余下的全标记为1。
3.一个加权的红硬币,正面的概率是0.9,背面的概率是0.1。
4.一个加权的绿硬币,正面的概率为0.95,背面的概率为0.05。
这个模型按照下面的规则从集合{1,2,3,4,5,6}产生一个数字序列:
1.从掷红骰子开始,记下出现的数字,记录结果。
2.投红硬币:
如果结果是正面,掷红骰子,记下结果;如果结果是背面,掷绿骰子,记下结果。
3.下面的每一步,抛和前一步所投骰子相同颜色的硬币。
如果硬币出现正面,滚和硬币相同颜色的骰子。
如果硬币出现反面,改为掷另种颜色的骰子。
骰子和硬币模型初始化:
转移矩阵A为:
混淆矩阵B为:
这个模型并不是隐藏的,因为我们从硬币和骰子的颜色已经知道状态序列。
假设,有其他人产生了一个发布结果,即隐层序列值,而没有向你展示硬币和骰子,你能看到的只有结果。
当你看到1比其他数字多时,你也许猜测这个模型是在绿色状态,但是因为你不能看到被投骰子的颜色,所以你并不能确定。
4.2Matlab函数说明
hmmgenerate:
已知转移矩阵A和混淆矩阵B,随机生成制定长度的观察序列和隐层序列
hmmestimate:
已知隐层序列和观察序列,最大似然估计转移矩阵A和混淆矩阵B
hmmtrain:
已知隐层序列,最大似然估计转移矩阵A和混淆矩阵B;需要初始猜测一下矩阵A和B。
hmmviterbi:
已知矩阵A,B和隐层序列,给出生成隐层序列最可能的观察序列。
4.3测试hmmviterbi函数
本文以最新的2014a版本的matlab做测试;利用hmmgenerate函数,以上面定义的转移矩阵A和混淆矩阵B随机生成长度为10的状态序列和隐层结果序列。
试验步骤:
Step1:
初始化转移概率:
TRANS=[.9.1;.05.95;];
初始化混淆矩阵:
EMIS=[1/6,……,1/6,1/6;7/12,1/12,……,1/12];
Step2:
生成长度为10的隐层和观察序列
代码:
[seq,states]=hmmgenerate(10,TRANS,EMIS)
变量seq为观察状态序列,states为隐层状态序列
Step3:
利用hmmviterbi函数,生成隐层状态序列(硬币颜色,天气状态)
代码:
likelystates=hmmviterbi(seq,TRANS,EMIS)
骰子和硬币实验,生成结果见下表:
seq
5
1
2
1
1
4
3
1
6
1
states
1
1
1
2
2
2
2
2
2
2
likelystates
1
2
2
2
2
2
2
2
2
2
海藻和天气实验,生成结果见下表:
seq
2
4
3
2
1
1
4
4
1
2
states
1
3
3
1
1
2
3
2
1
2
likelystates
2
3
3
1
1
1
2
3
1
1
结果分析:
已知转移矩阵A和混淆矩阵B,在给定观察状态序列(骰子点数,海藻状态),估计最可能的隐层状态时,基于viterbi算法的hmmviterbi函数,在10个观察状态序列下,随机100次实验,结果如下图所示。
骰子硬币例子达到了78.3%的准确率,海藻天气的例子只达到了57.3%的准确率;可以说在给定的数据长度前提下,hmmviterbi函数近似估计的结果具有很大的随机性,对于一些随机样本具有很好的估计效果,而有些样本的估计结果和真实结果偏差很大。
此外从两幅图的对比中,hmmviterbi函数对简单状态的模型估计效果较好,而对于相对复杂一些的状态在有限样本下,hmmviterbi近似拟合结果有些差。
当我们增加观察序列长度,即增加观察状态个数从10增加到1000时,预测结果如下图。
图像没有出现我们期望的样子;观察序列增大,估计准确率增大,反而在初期估计结果具有很大的震荡,随着观察序列的增多,估计准确率逐步趋向平稳。
由于骰子和硬币的例子转移概率和混淆矩阵,相对简单,估计准确率较高;而海藻和天气的例子,由于转移概率和混淆矩阵,比较平稳,也就是系统的不确定比较大,所以估计准确率较低。
这是由viterbi算法和随机性造成的,针对特定观察序列,viterbi算法依据最大概率原理,来确定最可能的隐层生成序列。
而由观察序列随机生成隐层序列时,每一个状态的变化都具有随机性,所以在模型简单,转移概率和混淆矩阵之间的概率差异明显,则相应的随机性要小一些,例如上面骰子和硬币的模型估计准确率较高;反之则估计准确率较低。
4.4测试hmmestimate函数
hmmestimate函数是在已知观察序列和隐层序列,用来估计状态转移矩阵A和混淆矩阵B。
由于矩阵A和B展示复杂,所以此处使用矩阵的1范数
作为相似矩阵之间差异的度量。
实验思路同4.3;实验在相同序列长度下,不同的随机样本结果,对于实验估计结果的影响;其次增加序列长度,观测估计结果的变化。
序列长度为100,实验100次,实验结果如下表:
骰子和硬币实验海藻和天气实验
序列长度相同的条件下,从图中可以看出,实验一矩阵A的误差1范数均值为0.0771,矩阵B的误差1范数为0.1584;实验一矩阵A的误差1范数均值为0.2409,矩阵B的误差1范数为0.2390。
此外,大部分随机序列结果之间差异不大;极个别序列对结果有较大的影响;实验一较好的估计了转移矩阵A和混淆矩阵B,实验二由于矩阵概率脚平均,模型随机性比较大,所以估计结果没有实验一好,所以任选一个随机序列来估计转移矩阵和混淆矩阵结果是可信的。
序列长度从100增加到2000,预测矩阵误差1范数如下图:
骰子和硬币实验海藻和天气实验
从两个实验可以看出,随着序列长度的增加,两个估计矩阵的数值越来越接近真实值,所以在模型确定的条件下,通过收集足够多的观察序列可以很好的估计未知的转移矩阵和混淆矩阵。
4.5hmmtrain函数说明
hmmtrain函数是在已知隐层序列,初始猜测矩阵A和B;然后最大似然估计转移矩阵A和混淆矩阵B;hmmtrain函数通过迭代方法,通过改变猜想的初始矩阵值,来最大估计生成已知的隐层序列。
如果算法为收敛,可以通过增大误差上限,和增加迭代次数来逼近收敛。
此方法需要依据经验来判断估计矩阵A和B,初始估计值越接近真实的矩阵,最后估计值越好。
下面就两个实验通过随机初始值对比,初始值的好坏对结果的影响。
实验一50次随机猜想A和B的初始值,观察序列长度为100,经,50次实验结果如下图所示:
骰子和硬币实验海藻和天气实验
从两幅图我们可以看出,曲线波动比较大,说明随机初始值对于最后的估计值有很大的影响,随机初始值越好,估计矩阵和真实值月接近。
此外,骰子和硬币实验中转移矩阵A的误差1范数均值为1.2228;混淆矩阵误差均值为1.0400;海藻和天气的实验中转移矩阵A的误差1范数为1.2021,混淆矩阵误差均值为1.0294;比较大的误差范数,说明使用hmmtrain函数来估计转移概率矩阵和混淆矩阵与真实值有较大的偏差。
所以为了获得更好的估计值,应该多次实验,使用不同的初始值;但是在只知道隐层序列的情况下,仅仅依靠hmmtrain给出的结果,从以上分析可以看出是不可靠的;如何判断最后估计矩阵的好坏,还有很大的研究空间。
本文还试验了UbcHMMtoolbox[5],由于其代码的最近一次更新是在2005年,实验后结果误差很大,遂不作为参考,详见附录代码[6]。
五、结论
本文主要介绍了隐马尔科夫过程的原理,及简单应用;并通过matlab工具箱来验证hmm各个函数的功能和效果。
通过介绍学习,隐马尔科夫过程,能够通过不同事物间的联系,通过一个事物状态来“预测”另一事物的状态;例如上面的海藻和天气的状态的相互“预测”。
通过具体实验我们发现matlab工具箱中提供的函数,在很多情况下不能够很好的估计结果,而且现象的随机性越大,估计误差越大;这主要是由于观察样本不足和函数算法本身的优化问题,因为viterbi等hmm算法,都是局部寻优算法,很多时候,并不是全局的最优算法;所以在目前情况下,可以通过增加观察序列的个数和改进算法来提高估计的准确率。
参考文献:
[1]likelet,隐马尔可夫模型(HMM)攻略,
[2]XX百科,马尔科夫模型
[3]52nlp,HMM学习最佳范例、
[4]Mathwork,Matlab隐马尔科夫代码介绍
[5]Ubc,HMMtoolbox
http:
//www.cs.ubc.ca/~murphyk/Software/HMM/hmm.html
[6]琳檬香,matlab工具包各种数据处理
附录:
程序代码
A.ubctoolbox代码
%seaweedandweather
TRANS=[0.50.3750.125;0.250.1250.625;0.250.3750.375];
EMIS=[0.60.20.150.05;0.250.250.250.25;0.050.100.350.50];
%diceandcoin
%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];
O=4;%numberofobserablestates
Q=3;%numberofhiddenstates
prior0=normalise(rand(Q,1));
transmat0=TRANS;obsmat0=EMIS;
%samplenex=20sequencesoflengthT=10eachfromthismodel,touseastrainingdata.
T=10;nex=20;
data=dhmm_sample(prior0,transmat0,obsmat0,nex,T);%similartohmmgenerate();
%Heredatais20x10.Nowwemakearandomguessastowhattheparametersare
prior1=normalise(rand(Q,1));
transmat1=mk_stochastic(rand(Q,Q));
obsmat1=mk_stochastic(rand(Q,O));
%andimproveourguessusing10iterationsofEM...
[LL,prior2,transmat2,obsmat2]=dhmm_em(data,prior1,transmat1,obsmat1,'max_iter',10);
%loglik=dhmm_logprob(data,prior2,transmat2,obsmat2)
B.hmmviterbi函数测试代码
%diceexampledata
%TRANS=[.9.1;.05