隐马尔科夫模型HMM详解——python实现
Posted 栋次大次
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隐马尔科夫模型HMM详解——python实现相关的知识,希望对你有一定的参考价值。
目录
代码地址:https://gitee.com/liangcd/speech_learning/tree/master/HMM
HMM基本概念、概率计算、预测算法请看上一篇文章,感谢您的阅读!
学习算法
已知观测序列 O = ( o 1 , o 2 , … , o T ) , b j ( o t ) = ∑ m = 1 M c j m N ( o t ; μ j m , Σ j m ) O=\\left(o_1, o_2, \\ldots, o_T\\right), b_j\\left(o_t\\right)=\\sum_m=1^M c_j m \\mathcalN\\left(o_t ; \\mu_j m, \\Sigma_j m\\right) O=(o1,o2,…,oT),bj(ot)=∑m=1McjmN(ot;μjm,Σjm),估计GMM-HMM参数 λ \\lambda λ,使 P ( O ∣ λ ) P(O|\\lambda) P(O∣λ)最大。参数 λ \\lambda λ包括:
-
初始状态概率向量 π = ( π i ) \\pi = (\\pi_i) π=(πi)
-
转移概率矩阵 A = [ a i j ] N × N A=[a_ij]_N\\times N A=[aij]N×N
-
状态 j j j的GMM参数 ( c j m , μ j m , Σ j m ) (c_jm,\\mu_jm,\\Sigma_jm) (cjm,μjm,Σjm), j = 1 , 2 , . . . , N ; m = 1 , . . . , M j=1,2,...,N; m=1,...,M j=1,2,...,N;m=1,...,M表示GMM分量标号。
Viterbi学习算法
如果已知状态-观测对齐序列,每个观测 o t o_t ot对应一个具体的状态,状态-观测对齐序列可通过Viterbi解码算法得到,也可通过人工标注得到。知道每个观测对应的状态,则:
π i \\pi_i πi可通过最大似然估计得到:
- 令 C ( i ) C(i) C(i)表示初始状态为 i i i 的次数
- π ^ i = C ( i ) ∑ k C ( k ) \\widehat\\pi_i=\\fracC(i)\\sum_k C(k) π i=∑kC(k)C(i)
a i j a_ij aij也可通过最大似然估计得到:
- 令 C ( i → j ) C(i \\rightarrow j) C(i→j)表示从状态 i i i到状态 j j j的转移次数
- a ^ i j = C ( i → j ) ∑ k C ( i → k ) \\hata_i j=\\fracC(i \\rightarrow j)\\sum_k C(i \\rightarrow k) a^ij=∑kC(i→k)C(i→j)
可得每个状态 j j j对应的观测集合 Z j = ( y 1 , y 2 , … , y N ) Z_j=\\left(y_1, y_2, \\ldots, y_N\\right) Zj=(y1,y2,…,yN),每个状态对应一个GMM,也就得到了每个GMM对应的观测集合 Z j = ( y 1 , y 2 , … , y N ) Z_j=\\left(y_1, y_2, \\ldots, y_N\\right) Zj=(y1,y2,…,yN)。
问题:用viterbi算法得到对齐序列需要用到模型参数 λ \\lambda λ,最初的 λ \\lambda λ怎么得到?
当GMM只有一个分量, b j ( o t ) = N ( o t ; μ j , Σ j ) b_j\\left(o_t\\right)=\\mathcalN\\left(o_t ; \\mu_j, \\Sigma_j\\right) bj(ot)=N(ot;μj,Σj), ∣ Z j ∣ |Z_j| ∣Zj∣表示 Z j Z_j Zj的元素个数,则:
μ
^
j
=
∑
o
t
∈
Z
j
o
t
∣
Z
j
∣
\\hat\\mu_j=\\frac\\sum_o_t \\in Z_j o_t\\left|Z_j\\right|
μ^j=∣Zj∣∑ot∈Zjot 以上是关于隐马尔科夫模型HMM详解——python实现的主要内容,如果未能解决你的问题,请参考以下文章 大道至简机器学习算法之隐马尔科夫模型(Hidden Markov Model, HMM)详解---学习问题:Baum-Welch算法推导
Σ
^
j
=
∑
o
t
∈
Z
j
(
o
t
−
μ
^
j
)
(
o
t
−
μ
^
j