非监督学习中的HMM在Python中可以通过hmmlearn库来实现。hmmlearn曾经是scikit-learn的一部分,现在是独立的Python包,项目托管在Git Hub上,官方文档地址为https://hmmlearn.readthedocs.io/en/stable/,通过以下方式安装:
hmmlearn实现了三种HMM模型类——Gaussian HMM、GMMHMM、Multinomial HMM,按照观测状态是连续的状态还是离散的状态,可以分为两类。其中,Gaussian HMM和GMMHMM是连续观测状态的HMM模型类,而Multinomial HMM是离散观测状态的模型类。
对于离散观测状态的Multinomial HMM模型,“startprob_”参数表示隐藏状态的初始状态概率分布π,“transmat_”参数表示状态转移概率矩阵A,“emissionprob_”参数则对应观测状态概率矩阵B。设定了HMM模型参数后,就可以通过model.decode(观测矩阵,algorithm=‘viterbi’)进行隐藏状态序列的预测。训练Multinomial HMM模型时,一些重要参数有:
n_components:隐藏状态的个数。
n_iter:可选参数,训练时的最大迭代次数;
tol:可选参数,为浮点数,表示EM算法对数似然函数增益的阈值;
verbose:可选参数,为true时,会向输出返回迭代次数和本次迭代后的概率值。(www.xing528.com)
Init_params:可选的字符串,设定哪些HMM模型参数会在训练时进行初始化,“‘s’”表示startprob,即π;“‘t’”表示transmat,即A;“‘e’”表示emissionprob,即B。“”空字符串表示全部使用用户提供的参数进行训练。
对于连续观测状态的HMM模型,Gaussian HMM模型类假设观测状态符合高斯分布,而GMMHMM模型类则假设观测状态符合混合高斯分布。通常使用Gaussian HMM模型类即可。
在Gaussian HMM模型类中,“startprob_”和“transmat_”和前面介绍的一致,分别表示π和A,比较特殊的是观测状态概率的表示方法,由于是连续值,无法像Multinomial HMM模型类一样直接给出矩阵B,而是给出与各个隐藏状态对应的观测状态高斯分布的概率密度函数的参数。如果观测数据序列是一维的,则观测状态的概率密度函数符合一维的普通高斯分布。如果观测数据序列是N维的,则与隐藏状态对应的观测状态的概率密度函数符合N维高斯分布。高斯分布的概率密度函数参数可以用μ表示期望向量,用Σ表示高斯分布的协方差矩阵。对应在Gaussian HMM模型类中,“means”用来表示各个隐藏状态的高斯分布期望向量μ形成的矩阵,而“covars”用来表示与各个隐藏状态对应的高斯分布协方差矩阵Σ形成的三维张量。
例4.12天气和小红心情的例子,使用hmmlearn求解的代码如下。
完整代码请参考\C4\s4_5_4_HMM\hmm_01.py。
假设例4.12只是观测到小红的心情为“开心、开心、不开心、不开心、不开心、开心”,训练HMM模型参数的代码请参考\C4\s4_5_4_HMM\hmm_02.py。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。