
hmm模型
喜得千金祝福语-聊城安全教育平台登录入口
2023年2月22日发(作者:温度计种类)HMM隐马尔可夫模型MATLAB
HMM隐马尔可夫模型
Intro
维基百科定义:隐马尔可夫模型⽤来描述⼀个含有隐含未知参数的,⽽马尔可夫过程是是⼀个具备了的,当⼀个在给定现在状态及所有过去
状态情况下,其未来状态的条件仅依赖于当前状态;换句话说,在给定现在状态时,它与过去状态(即该过程的历史路径)是的,那么此即
具有马尔可夫性质。
MatlabHMM定义:
AhiddenMarkovmodel(HMM)isoneinwhichyouobserveasequenceofemissions,butdonotknowthesequenceofstates
esofhiddenMarkovmodelsseektorecoverthesequenceofstates
fromtheobserveddata.
⼈话(个⼈理解):
我们可以做⼀个假设:世界上的很多随机现象,⽐如天⽓(晴天或是下⾬天),看似随机其实背后都是有其真正的原因,我们假设这些随机
表象背后是由数个真正的原因所决定的,⽽且每⼀个状态只与上⼀个状态相关(今天的天⽓只与昨天天⽓背后的隐藏状态有关),我们称满
⾜这样假设的模型为马尔可夫模型。我们在这⾥称表象(晴天或是下⾬天)为emissions(发射)或者theobserveddata,称背后真正的原因
为hiddenstate(隐藏状态)。之所以将表象称为发射,是因为⼀个表象是由⼀个隐藏状态“发射”⽽来,每⼀天都是由⼀个隐藏状态产⽣,⽽每
⼀个隐藏状态都可能产⽣其他的表象,产⽣表象的概率矩阵被称为发射矩阵B。每⼀天的隐藏状态之间也存在转移概率,此概率矩阵被称为
转移矩阵A。初始隐藏状态的概率矩阵被称为π
于是这就是隐马尔可夫模型(HMM)的重要三个矩阵A,B,π
隐马尔可夫模型提出以下问题:
给定的发射序列,求最可能的状态序列
给定的发射序列,你将如何估计模型的转移概率和输出概率?
模型⽣成给定序列的先验概率是多少?
在给定序列中某个状态时,模型的后验概率是多少?
HiddenMarkovmodelsraisethefollowingquestions:
Givenasequenceofemissions,whatisthemostlikelystatepath?
Givenasequenceofemissions,howcanyouestimatetransitionandemissionprobabilitiesofthemodel?
Whatistheforwardprobabilitythatthemodelgeneratesagivensequence?
Whatistheposteriorprobabilitythatthemodelisinaparticularstateatanypointinthesequence?
模型需要指定⼀个转移矩阵TRANS和⼀个发射矩阵EMIS,TRANS(i,j)是隐藏状态i转移到j的概率,EMIS(i,j)是序列seq在隐藏状态i时发射出符号j
的概率。
设N为隐藏状态的状态个数,M为发射序列(emissions)中元素(symbol)可能的值的个数,则TRANS矩阵⼤⼩为N×N,EMIS矩阵⼤⼩为N×M
时间复杂度,再设V为发射序列(emissions)中元素(symbol)的维数,则易知隐藏状态x(t)转移到x(t+1)复杂度为N×N,隐藏状态x(t)发射⼀个
元素y(t)的复杂度为N×M×V
实现
MATLAB中提供了相关的⼯具箱
⽣成测试数列
输出发射序列seq和序列状态states。
测试状态序列
函数使⽤算法Viterbi计算模型⽣成序列seq最有可能经过的状态序列
likelystates序列的长度和seq相同。
测试hmmviterbi的准确度可以将序列likelystates和原状态序列states⽐较
[seq,states]=hmmgenerate(1000,TRANS,EMIS);
likelystates=hmmviterbi(seq,TRANS,EMIS);
sum(states==likelystates)/1000
此样例可知准确度为82%
估算转移矩阵TRANS和发射矩阵EMIS
函数和可以通过发射序列seq估算模型的转移矩阵TRANS和发射矩阵EMIS。
使⽤hmmestimate函数时需要序列的states(即在⽣成测试序列时的返回值states)
如果不知道序列的states并且对于转移矩阵TRANS和发射矩阵EMIS有初步猜想,可以可以使⽤hmmtrain函数来估算序列的转移矩阵TRANS和发
射矩阵EMIS
hmmtrain使⽤Baum-Welch迭代算法,通过改变TRANS_GUESS和EMIS_GUESS以便让模型更有可能⽣成观察序列seq。当两个连续迭代中的矩阵
彼此公差很⼩的时候,算法停⽌。
如果算法在默认值为100的最⼤迭代次数内未能达到此公差,则算法将停⽌,hmmtrain将返回TRANS_EST和EMIS_EST的最后⼀个值,并发出未
达到公差的警告。
如果算法未能达到所需的公差,请使⽤以下命令增加最⼤迭代次数的默认值:
其中,maxiter是算法执⾏的最⼤步数。
使⽤以下命令更改公差的默认值:
其中,tol是公差的期望值。增加tol的值会使算法更快地停⽌,但结果不太准确。
有两个因素会降低hmmtrain输出矩阵的可靠性:
该算法收敛到⼀个局部极⼤值,该极⼤值不代表真实的过渡矩阵和发射矩阵。如果您怀疑这⼀点,请对矩阵TRANS_EST和EMIS_EST使
⽤不同的初始猜测。
序列seq可能太短,⽆法正确训练矩阵。如果您怀疑这⼀点,请对seq使⽤更长的序列。
估算先验后验概率
可以通过函数计算已经发射的序列seq在某⼀历史状态下的后验概率
输出值PSTATES是⼀个M-by-L(M乘L)矩阵,这⾥M是状态的数量,L是序列seq的长度。PSTATES(i,j)是模型在状态i时⽣成序列seq中符号j的
条件概率。
更详细的介绍:
PSTATES=hmmdecode(seq,TRANS,EMIS)可以根据隐马尔可夫(HMM)模型,计算出序列seq后⾯状态的可能性PSTATES。后续状态的可能性
是k和i的条件概率(给定观察序列的符号sym)。你应该通过指定⼀个转移矩阵TRANS和⼀个发射矩阵EMIS来使⽤模型。TRANS(i,j)是状态i转移
到j的概率,EMIS(k,seq)是序列seq由状态k发射出的概率。
(输出值PSTATES的介绍见上)
PSTATES=hmmdecode(seq,TRANS,EMIS)calculatestheposteriorstateprobabilities,PSTATES,ofthesequenceseq,fromahidden
teriorstateprobabilitiesaretheconditionalprobabilitiesofbeingatstatekatstepi,giventheobserved
sequenceofsymbols,cifythemodelbyatransitionprobabilitymatrix,TRANS,andanemissionsprobabilitymatrix,
(i,j)(k,seq)istheprobabilitythatsymbolseqisemittedfrom
statek.
注意:函数hmmdecode在第⼀次发射之前,状态1从step0开始。hmmdecode根据模型从状态1开始计算PSTATES中的概率。
**Note**Thefunctionhmmdecodebeginswiththemodelinstate1atstep0,odecomputesthe
probabilitiesinPSTATESbasedonthefactthatthemodelbeginsinstate1.
[PSTATES,logpseq]=hmmdecode(...)返回给定转移矩阵TRANS和发射矩阵EMIS下的对数概率logpseq
ans=
0.8200
[TRANS_EST,EMIS_EST]=hmmestimate(seq,states)
[TRANS_EST2,EMIS_EST2]=hmmtrain(seq,TRANS_GUESS,EMIS_GUESS)
hmmtrain(seq,TRANS_GUESS,EMIS_GUESS,'maxiterations',maxiter)
hmmtrain(seq,TRANS_GUESS,EMIS_GUESS,'tolerance',tol)
PSTATES=hmmdecode(seq,TRANS,EMIS)
PSTATES=hmmdecode(seq,TRANS,EMIS)
[PSTATES,logpseq]=hmmdecode(...)
[PSTATES,logpseq,FORWARD,BACKWARD,S]=hmmdecode(...)
hmmdecode(...,'Symbols',SYMBOLS)
[PSTATES,logpseq]=hmmdecode(...)returnslogpseq,thelogarithmoftheprobabilityofsequenceseq,giventransitionmatrix
TRANSandemissionmatrixEMIS.
[PSTATES,logpseq,FORWARD,BACKWARD,S]=hmmdecode(...)返回由S缩放后的先验概率和后验概率
[PSTATES,logpseq,FORWARD,BACKWARD,S]=hmmdecode(...)returnstheforwardandbackwardprobabilitiesofthe
sequencescaledbyS.
hmmdecode(...,'Symbols',SYMBOLS)指定了发射的符号。SYMBOLS可以是⼀个数值数组、字符串数组或者是⼀个包含符号的cellarray。默认的符
号是整数1到N,N是可能的发射数量。
hmmdecode(...,'Symbols',SYMBOLS)Scanbeanumericarray,astringarray,
aultsymbolsareintegers1throughN,whereNisthenumberofpossible
emissions.
后记
评价:不如Pythonhmmlearn,MATLAB再见
附
其中,关于矩阵的指定():
基本上来说,对于这个问题我们没有⼀种简单直接的答案。相反的,经验告诉我们⽆论是使⽤随机(subjecttothestochasticandthe
nonzerovalueconstraints)还是通过先验概率和转移矩阵的初始估计,都⾜以在⼏乎所有情况下对参数进⾏重新调整。
但是……(未翻译,参见原⽂)
可以通过多种⽅式获得矩阵参数
1.⼿动将观测序列分割为状态,并在状态内平均观测值
2.⽤平均值对观测值进⾏最⼤似然分割
3.带聚类的分段k-均值分段
Basically,d,experiencehasshownthateitherrandom
(subjecttothestochasticandthenonzerovalueconstraints)oruniforminitialestimatesofthepriorprobabilitiesandthe
transitionmatrixisadequateforgivingusefulreestimatesoftheseparametersinalmostallcases.
However,fortheemissionmatrix,experiencehasshownthatgoodinitialestimatesarehelpfulinthediscretesymbolcase,and
areessential(whendealingwithmultiplemixtures)inthecontinuousdistributioncase.
Suchinitialestimatescanbeobtainedinanumberofways,including:
1)manualsegmentationoftheobservationsequencesintostateswithaveragingobservationswithinstates,
2)maximumlikelihoodsegmentationofobservationswithaveraging,
3)segmentalk-meanssegmentationwithclustering,
etc.
Processingmath:100%