目录
隐马尔科夫模型的结构
马尔科夫链与隐马尔科夫模型
隐马尔科夫模型的全称为 Hidden Markov Model(HMM),这是一种统计模型,广泛应用于语音识别,词性自动标注等问题。马尔科夫链(回顾第十四课-马尔科夫链)与HMM的差距体现于Hidden,在这个模型中,首先由一个隐藏的马尔科夫链随机生成一个状态随机序列,再由状态随机序列中的每一个状态对应生成各自的观测,由这些观测构成一个观测随机序列。
实例
为了清晰说明问题,现在通过举例介绍HMM,第一个例子叫做:盒子摸球实验。有3个盒子,编号为1号,2号,3号,每个盒子里都装着个数不等的黑球和白球,具体情况如下描述:
- 1号盒子:黑球2个,白球8个;
- 2号盒子:黑球6个,白球4个;
- 3号盒子:黑球4个,白球6个;
实验过程如下:
每次先随机选择一个盒子,然后从随机选中的盒子中随机摸出一个球,并记录球的颜色,最后把球放回盒子。下一次再随机选择一个盒子,重复以上操作。
在实验过程中,我们只能在每次摸出球之后看到被摸出球的颜色,但不知道盒子的编号。因此,随着实验的进行,会依次出现不同编号的盒子,这个盒子的序列就是隐藏的状态序列 Z Z Z。由于我们只能观测到球的颜色,所以球的颜色序列为观测序列 X X X。
现在,我们假设每次盒子随机出现的过程是马尔科夫过程,状态集合为 Q = Q= Q={盒子1,盒子2,盒子3}, N = 3 N=3 N=3。同时,第一次各个盒子出现所满足的概率分布如下:
- 1号盒子出现的概率:0.3;
- 2号盒子出现的概率:0.5;
- 3号盒子出现的概率:0.2;
用 π \pi π表示初始状态的概率向量为: π = ( 0.3 , 0.5 , 0.2 ) T \pi=(0.3,0.5,0.2)^{T} π=(0.3,0.5,0.2)T,这就是状态的初始概率分布。
同时假设各个盒子之间相互转换的概率转移图如下:
从上图可以得到关于盒子的状态转移矩阵,记作
A
A
A:
对于实验中隐藏的状态序列,即三个盒子随机出现的过程如上所述,下面是从盒子中摸球的过程,比如在1号盒子中:黑球2个,白球8个,摸球后并放回。这是最简单的古典概型,从1号盒子中摸出黑球的概率为0.2,摸出白球的概率为0.8,即观测概率,也叫输出概率,它是从特定的隐含状态中生成指定观测的概率。
同样的,我们可以把2号盒子和3号盒子的观测概率求出,得到另一个矩阵(观测概率矩阵
B
B
B):
观测集合为
V
=
V=
V={黑球,白球},
M
=
2
M=2
M=2。
通过以上描述,重复7次上述过程,得到两个序列:
- 一个是长度为7的隐藏状态序列: I = I= I={2号,2号,1号,3号,1号,2号,3号};注意这个序列是实际存在的,只是我们不能观测到;
- 另一个是长度为7的观测序列: O = O= O={黑球,黑球,白球,黑球,白球,白球,黑球},这是我们可以观测到的序列;
在本次盒子摸球实验中,可以得到以下序列关系:
上图直观表达了HMM的两个核心:
- 1.隐:即状态序列,盒子序列是我们看不到的,即隐藏的;
- 2.马尔科夫:指的是整个隐藏状态序列,隐状态之间的转换是一个马尔科夫过程,即隐状态之间的转换遵循指定的概率。
将以上信息反映到概率转移图中,可以看到隐马尔科夫的全部信息:
另一个实例更加贴近生活,一个婴儿有两种状态:{饿了,困了},但是婴儿不会说话,所以我们无法观测到这两个状态。我们只能从他的行为去推断隐状态,行为有三种:{哭闹,无精打采,爬来爬去},这就是观测集。
隐状态之间的转移是一个马尔科夫过程,而从状态表现出的行为也会符合一定的概率分布:
这其中的状态集合
Q
Q
Q,观测集合
V
V
V,状态转移概率矩阵
A
A
A,观测概率矩阵
B
B
B,可以直观从上图得到。
HMM的要素
通过上面的两个实例,用形式化的语言总结HMM的要素:
HMM是一个时序模型,首先由一个隐藏的马尔科夫链按照其设定的状态转移概率,生成一个状态序列,但是这个状态序列是不能观测到的,然后再由每个状态按照观测概率(又称为输出概率)生成对应的观测,由此构成可观测的观测序列。
HMM中所有的隐含状态构成状态集合 Q = { q 1 , q 2 , . . . , q N } Q=\left\{q_{1},q_{2},...,q_{N}\right\} Q={q1,q2,...,qN},状态个数为 N N N,所有的观测构成观测集合 V = { v 1 , v 2 , . . . , v M } V=\left\{v_{1},v_{2},...,v_{M}\right\} V={v1,v2,...,vM},观测的个数为 M M M。经过一段时间 T T T之后,生成长度为 T T T的状态序列 I = { i 1 , i 2 , . . . , i T } I=\left\{i_{1},i_{2},...,i_{T}\right\} I={i1,i2,...,iT}和对应的观测序列 O = { o 1 , o 2 , . . . , o T } O=\left\{o_{1},o_{2},...,o_{T}\right\} O={o1,o2,...,oT}。
以上是HMM的外在表征,推动HMM运行的是三个要素:状态转移概率矩阵 A A A,观测概率矩阵 B B B(输出概率矩阵),初始隐含状态的概率向量 π \pi π,简写为 λ = { A , B , π } \lambda=\left\{A,B,\pi\right\} λ={A,B,π}。
初始概率向量
π
=
(
π
1
,
π
2
,
.
.
.
,
π
N
)
\pi=(\pi_{1},\pi_{2},...,\pi_{N})
π=(π1,π2,...,πN),其中
π
n
\pi_{n}
πn表示隐含状态序列中第1个状态为
q
n
q_{n}
qn的概率,即:
π
n
=
P
(
i
1
=
q
n
)
\pi_{n}=P(i_{1}=q_{n})
πn=P(i1=qn)
状态转移概率矩阵
A
A
A本质上就是马尔科夫链的转移概率矩阵,
A
A
A是一个
N
×
N
N\times N
N×N的方阵:
其中,
a
i
j
a_{ij}
aij表示从隐含状态
i
i
i转移到隐含状态
j
j
j的概率,即
a
i
j
=
P
(
i
t
+
1
=
q
j
∣
i
t
=
q
i
)
a_{ij}=P(i_{t+1}=q_{j}|i_{t}=q_{i})
aij=P(it+1=qj∣it=qi);
观测概率矩阵
B
B
B是一个
N
×
M
N\times M
N×M的矩阵:
其中,
b
i
j
b_{ij}
bij指的是在某时刻
t
t
t,隐含状态为
q
i
q_{i}
qi的情况下,生成观测
v
j
v_{j}
vj的概率,即
b
i
j
=
P
(
o
1
=
v
j
∣
i
t
=
q
i
)
b_{ij}=P(o_{1}=v_{j}|i_{t}=q_{i})
bij=P(o1=vj∣it=qi)
模型的性质
t t t时刻的隐状态只与前一时刻的隐状态相关:
在隐马尔科夫模型的三要素中,状态转移概率矩阵
A
A
A和初始状态概率向量
π
\pi
π完全确定了隐藏的马尔科夫链,其性质服从马尔科夫性,可以描述为:
P
(
i
t
∣
i
t
−
1
,
o
t
−
1
,
i
t
−
2
,
o
t
−
2
,
.
.
.
,
i
1
,
o
1
)
=
P
(
i
t
∣
i
t
−
1
)
P(i_{t}|i_{t-1},o_{t-1},i_{t-2},o_{t-2},...,i_{1},o_{1})=P(i_{t}|i_{t-1})
P(it∣it−1,ot−1,it−2,ot−2,...,i1,o1)=P(it∣it−1)
t
t
t时刻的观测只与该时刻的隐状态相关:
该性质描述为: P ( o t ∣ i t , i t − 1 , o t − 1 , i t − 2 , o t − 2 , . . . , i 1 , o 1 ) = P ( o t ∣ i t ) P(o_{t}|i_{t},i_{t-1},o_{t-1},i_{t-2},o_{t-2},...,i_{1},o_{1})=P(o_{t}|i_{t}) P(ot∣it,it−1,ot−1,it−2,ot−2,...,i1,o1)=P(ot∣it)
推理问题:HMM的状态解码
隐状态解码问题
前面描述了HMM的概率估计,现在讨论HMM的状态解码。解码,即给定已知的观测序列,求它最有可能对应的状态序列。
即已知模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π),观测序列 O = ( o 1 , o 2 , . . . , o T ) O=(o_{1},o_{2},...,o_{T}) O=(o1,o2,...,oT),求使得条件概率 P ( I ∣ O ) P(I|O) P(I∣O)最大的隐状态序列 I = ( i 1 , i 2 , . . . , i T ) I=(i_{1},i_{2},...,i_{T}) I=(i1,i2,...,iT);
先不考虑输出的观测,只考虑隐状态的转移,目标是找到路径概率最大的一条状态序列。对照下图,图中展现了HMM的状态序列,其中一共包含5种隐状态,状态的序列长度为7,图中横轴是时间轴,纵轴是状态轴:
最大路径概率与维特比算法
从整个隐状态序列的最后面向前看,在第7个时间点,即最后一个时间点,要考虑状态序列的最后一个状态是状态 [ 1 , 2 , 3 , 4 , 5 ] [1,2,3,4,5] [1,2,3,4,5]中的哪一个,即路径以哪个结束可以获得最大概率。
首先关注最后一个时间点(时间点7),问题变成如果状态转移的路径以结束于状态
k
k
k的路径概率最大,概率该如何表示?而时间点6也可以取5种状态的任一种,最终取决于从哪个状态转移到时间点7的状态
k
k
k有最大概率。如下所示:
我们令
X
6
i
X_{6i}
X6i表示到达时间点6时,此时状态为
i
i
i的最大路径概率,状态
i
i
i可以取
{
1
,
2
,
3
,
4
,
5
}
\left\{1,2,3,4,5\right\}
{1,2,3,4,5}中的任意一个,那么实际上就有
X
61
,
X
62
,
X
63
,
X
64
,
X
65
X_{61},X_{62},X_{63},X_{64},X_{65}
X61,X62,X63,X64,X65五个不同的值。在上图中,对应了虚线框内五种颜色示意的到达时间节点6的五条路径,他们分别是在时间节点6时到达对应状态
i
i
i的最大概率路径。
那么用它乘以对应的状态转移概率,即
X
6
i
A
i
k
X_{6i}A_{ik}
X6iAik,就推进到第7个时间节点。首先固定第7个时间节点结束的状态,比如选择状态1,则可以分别求出从第6个时间节点的状态1,状态2,状态3,状态4,状态5转移到时间点7状态1的概率:
X
61
A
11
,
X
62
A
21
,
X
63
A
31
,
X
64
A
41
,
X
65
A
51
X_{61}A_{11},X_{62}A_{21},X_{63}A_{31},X_{64}A_{41},X_{65}A_{51}
X61A11,X62A21,X63A31,X64A41,X65A51
我们计算出这5个值,取最大值为结束于状态1的最大路径概率。
同理,我们分别假设,令时间点7的结束状态为2,3,4,5,按照上述步骤,取每个结束状态的最大概率路径。然后在这些结束状态的最大路径中选最大的一个,作为最后真正的最大路径。
对于 X 6 i X_{6i} X6i,它依赖于时间点5的 X 5 j X_{5j} X5j,一直追溯到最早的时间点1为尽头。因此,现在从时间点1出发,描述以上过程:
- 首先在时间点1,我们计算出各种状态出现的概率,由于只有一个节点,因此这个概率值就是此时的最大路径概率 X 1 i X_{1i} X1i;
- 然后我们再向前前进到时间点2,对于每一个状态 j j j,我们通过利用时间点1的每一个状态的最大路径乘以转移概率,得到5个到达时间点2,状态 j j j的路径概率,取最大的一个作为此时的最大路径概率 X 2 j X_{2j} X2j,即: X 2 j = m a x ( X 1 i A i j ) X_{2j}=max(X_{1i}A_{ij}) X2j=max(X1iAij)其中, i i i遍历1,2,3,4,5每一个状态。同时,我们把最大路径的序列记录下来。
- 以此类推,我们基于时间点 t t t中,各状态的最大路径概率,就可以前向计算出 t + 1 t+1 t+1中各状态的最大路径概率,直到最后一个时间节点 T T T,我们得到时间节点 T T T的所有状态的最大概率路径 X T i X_{Ti} XTi,取最大值: m a x ( X T i ) max(X_{Ti}) max(XTi)其中, i i i遍历1,2,3,4,5每一个状态。这就是我们要求的最大路径概率,以及结束的状态,然后依据记录的路径得到目标的隐状态序列。
以上即为求最大概率路径的方法,即维特比算法(用于计算最大或最小路径的动态规划算法)。
使用维特比算法解码
下面,我们将维特比算法用于HMM的解码,维特比算法中最大概率路径对应着HMM要求的状态序列,不过现在不光要考虑隐状态的转移概率,还有观测输出概率。
即要寻找一条隐状态 ( i 1 , i 2 , . . . , i t ) (i_{1},i_{2},...,i_{t}) (i1,i2,...,it),用它生成指定的观测序列 ( o 1 , o 2 , . . . , o t ) (o_{1},o_{2},...,o_{t}) (o1,o2,...,ot),使得观测序列的存在概率最大。描述为: δ t ( i ) = m a x P ( i t = i , i t − 1 , . . . , i 1 , o t , . . . , o 1 ) \delta_{t}(i)=maxP(i_{t}=i,i_{t-1},...,i_{1},o_{t},...,o_{1}) δt(i)=maxP(it=i,it−1,...,i1,ot,...,o1)其中, i = 1 , 2 , 3 , . . . , N i=1,2,3,...,N i=1,2,3,...,N,表示在时刻 t t t,结束于隐状态 i i i,同时满足观测序列 ( o 1 , o 2 , . . . , o t ) (o_{1},o_{2},...,o_{t}) (o1,o2,...,ot)的最大路径概率,这个表达式同时考虑了隐状态和输出观测,是一个联合概率,其中 i i i取 1 , 2 , 3 , . . . , N 1,2,3,...,N 1,2,3,...,N,最终我们取最大的 P P P。
以此类推: δ t + 1 ( i ) = m a x P ( i t + 1 = i , i t , . . . , i 1 , o t + 1 , . . . , o 1 ) \delta_{t+1}(i)=maxP(i_{t+1}=i,i_{t},...,i_{1},o_{t+1},...,o_{1}) δt+1(i)=maxP(it+1=i,it,...,i1,ot+1,...,o1)其中, i = 1 , 2 , 3 , . . . , N i=1,2,3,...,N i=1,2,3,...,N;
对于
δ
t
+
1
(
i
)
\delta_{t+1}(i)
δt+1(i)和
δ
t
(
i
)
\delta_{t}(i)
δt(i)的递推关系,我们根据HMM进行状态转移,再进行观测输出,所以有:
δ
t
+
1
(
i
)
=
m
a
x
(
δ
t
(
j
)
a
j
i
b
i
o
t
+
1
)
\delta_{t+1}(i)=max(\delta_{t}(j)a_{ji}b_{io_{t+1}})
δt+1(i)=max(δt(j)ajibiot+1)证明如下:
m
a
x
(
δ
t
(
j
)
a
j
i
b
i
o
t
+
1
)
=
m
a
x
(
δ
t
(
j
)
a
j
i
)
b
i
o
t
+
1
max(\delta_{t}(j)a_{ji}b_{io_{t+1}})=max(\delta_{t}(j)a_{ji})b_{io_{t+1}}
max(δt(j)ajibiot+1)=max(δt(j)aji)biot+1
=
m
a
x
[
(
m
a
x
P
(
i
t
=
j
,
i
t
−
1
,
.
.
.
,
i
1
,
o
t
,
.
.
.
,
o
1
)
)
P
(
i
t
+
1
=
i
∣
i
t
=
j
)
P
(
o
t
+
1
∣
i
t
+
1
=
i
)
]
=max[(maxP(i_{t}=j,i_{t-1},...,i_{1},o_{t},...,o_{1}))P(i_{t+1}=i|i_{t}=j)P(o_{t+1}|i_{t+1}=i)]
=max[(maxP(it=j,it−1,...,i1,ot,...,o1))P(it+1=i∣it=j)P(ot+1∣it+1=i)]
=
m
a
x
[
P
(
i
t
+
1
=
i
,
i
t
=
j
,
i
t
−
1
,
.
.
.
,
i
1
,
o
t
,
.
.
.
,
o
1
)
]
P
(
o
t
+
1
∣
i
t
+
1
=
i
)
=max[P(i_{t+1}=i,i_{t}=j,i_{t-1},...,i_{1},o_{t},...,o_{1})]P(o_{t+1}|i_{t+1}=i)
=max[P(it+1=i,it=j,it−1,...,i1,ot,...,o1)]P(ot+1∣it+1=i)
=
m
a
x
[
P
(
i
t
+
1
=
i
,
i
t
,
i
t
−
1
,
.
.
.
,
i
1
,
o
t
+
1
,
o
t
,
.
.
.
,
o
1
)
)
]
=
δ
t
+
1
(
i
)
=max[P(i_{t+1}=i,i_{t},i_{t-1},...,i_{1},o_{t+1},o_{t},...,o_{1}))]=\delta_{t+1}(i)
=max[P(it+1=i,it,it−1,...,i1,ot+1,ot,...,o1))]=δt+1(i)
现在回顾递推公式:
δ
t
+
1
(
i
)
=
m
a
x
(
δ
t
(
j
)
a
j
i
b
i
o
t
+
1
)
\delta_{t+1}(i)=max(\delta_{t}(j)a_{ji}b_{io_{t+1}})
δt+1(i)=max(δt(j)ajibiot+1),与上一部分维特比算法求路径概率的例子相比,多了一个观测输出概率
b
i
o
t
+
1
b_{io_{t+1}}
biot+1,这个值是已知的,只是比单纯的路径概率多进行了一次观测输出概率的乘积运算。
按照维特比算法从 δ 1 ( i ) \delta_{1}(i) δ1(i)起步,一步一步按照上述方法推导到 δ T ( i ) \delta_{T}(i) δT(i),求得最大的概率,同时在递推过程中记录序列。
实例演示
现在用盒子摸球模型演示计算过程,隐状态集合为
Q
=
Q=
Q={盒子1,盒子2,盒子3},
N
=
3
N=3
N=3,初始概率
π
=
(
0.3
,
0.5
,
0.2
)
T
\pi=(0.3,0.5,0.2)^{T}
π=(0.3,0.5,0.2)T,状态概率矩阵为
A
A
A:
观测集合
V
=
V=
V={黑球,白球},
M
=
2
M=2
M=2,观测概率矩阵为
B
B
B:
并且,已知观测序列为 {黑球,白球,黑球};
首先,在初始化时,对于在
t
=
1
t=1
t=1时刻,隐状态为
i
i
i,观测
o
1
o_{1}
o1为黑球的概率
δ
1
(
i
)
\delta_{1}(i)
δ1(i),有:
δ
1
(
1
)
=
π
1
b
1
o
1
=
0.3
×
0.2
=
0.06
\delta_{1}(1)=\pi_{1}b_{1o_{1}}=0.3\times 0.2=0.06
δ1(1)=π1b1o1=0.3×0.2=0.06
δ
1
(
2
)
=
π
2
b
2
o
1
=
0.5
×
0.6
=
0.30
\delta_{1}(2)=\pi_{2}b_{2o_{1}}=0.5\times 0.6=0.30
δ1(2)=π2b2o1=0.5×0.6=0.30
δ
1
(
3
)
=
π
3
b
3
o
1
=
0.2
×
0.4
=
0.08
\delta_{1}(3)=\pi_{3}b_{3o_{1}}=0.2\times 0.4=0.08
δ1(3)=π3b3o1=0.2×0.4=0.08递推到
t
=
2
t=2
t=2时,表示在
t
=
1
t=1
t=1时隐状态为
j
j
j号盒子,输出观测
o
1
o_{1}
o1为黑球,
t
=
2
t=2
t=2时隐状态为
i
i
i号盒子,输出观测
o
2
o_{2}
o2为白球的最大概率为:
δ
2
(
i
)
=
m
a
x
[
δ
1
(
j
)
a
j
i
]
b
i
o
2
\delta_{2}(i)=max[\delta_{1}(j)a_{ji}]b_{io_{2}}
δ2(i)=max[δ1(j)aji]bio2
所以有:
δ
2
(
1
)
=
m
a
x
[
δ
1
(
j
)
a
j
1
]
b
1
o
2
=
m
a
x
[
δ
1
(
1
)
a
11
,
δ
1
(
2
)
a
21
,
δ
1
(
3
)
a
31
]
b
1
o
2
\delta_{2}(1)=max[\delta_{1}(j)a_{j1}]b_{1o_{2}}=max[\delta_{1}(1)a_{11},\delta_{1}(2)a_{21},\delta_{1}(3)a_{31}]b_{1o_{2}}
δ2(1)=max[δ1(j)aj1]b1o2=max[δ1(1)a11,δ1(2)a21,δ1(3)a31]b1o2
=
m
a
x
[
0.06
×
0.4
,
0.3
×
0.3
,
0.08
×
0.2
]
0.8
=
m
a
x
[
0.024
,
0.09
,
0.016
]
0.8
=
0.072
=max[0.06\times 0.4,0.3\times 0.3,0.08\times 0.2]0.8=max[0.024,0.09,0.016]0.8=0.072
=max[0.06×0.4,0.3×0.3,0.08×0.2]0.8=max[0.024,0.09,0.016]0.8=0.072
同时记录 t = 1 t=1 t=1时, j = 2 j=2 j=2;
δ
2
(
2
)
=
m
a
x
[
δ
1
(
j
)
a
j
2
]
b
2
o
2
=
m
a
x
[
δ
1
(
1
)
a
12
,
δ
1
(
2
)
a
22
,
δ
1
(
3
)
a
32
]
b
2
o
2
\delta_{2}(2)=max[\delta_{1}(j)a_{j2}]b_{2o_{2}}=max[\delta_{1}(1)a_{12},\delta_{1}(2)a_{22},\delta_{1}(3)a_{32}]b_{2o_{2}}
δ2(2)=max[δ1(j)aj2]b2o2=max[δ1(1)a12,δ1(2)a22,δ1(3)a32]b2o2
=
m
a
x
[
0.024
,
0.06
,
0.048
]
0.4
=
0.024
=max[0.024,0.06,0.048]0.4=0.024
=max[0.024,0.06,0.048]0.4=0.024
其中 b 2 o 2 = 0.4 b_{2o_{2}}=0.4 b2o2=0.4,同时记录 t = 1 t=1 t=1时, j = 2 j=2 j=2;
δ
2
(
3
)
=
m
a
x
[
δ
1
(
j
)
a
j
3
]
b
3
o
2
=
m
a
x
[
δ
1
(
1
)
a
13
,
δ
1
(
2
)
a
23
,
δ
1
(
3
)
a
33
]
b
3
o
2
\delta_{2}(3)=max[\delta_{1}(j)a_{j3}]b_{3o_{2}}=max[\delta_{1}(1)a_{13},\delta_{1}(2)a_{23},\delta_{1}(3)a_{33}]b_{3o_{2}}
δ2(3)=max[δ1(j)aj3]b3o2=max[δ1(1)a13,δ1(2)a23,δ1(3)a33]b3o2
=
m
a
x
[
0.012
,
0.15
,
0.016
]
0.6
=
0.09
=max[0.012,0.15,0.016]0.6=0.09
=max[0.012,0.15,0.016]0.6=0.09
其中 b 3 o 2 = 0.6 b_{3o_{2}}=0.6 b3o2=0.6,同时记录 t = 1 t=1 t=1时, j = 2 j=2 j=2;
我们把上述过程的结果可视化:
现在递推到
t
=
3
t=3
t=3:
结果可视化为:
现在,我们从最后一个时间节点3开始,选择状态2,它的路径概率最大;
通过追溯,得到状态序列为:{盒子2,盒子3,盒子2}
基于Python对盒子摸球实验进行状态解码
下面基于Python实现了上述过程的手工计算,HMM使用hmmlearn
实现,相关文档为:hmmlearn,其提供了三种模型:
名称 | 简介 | 观测类型 |
---|---|---|
hmm.GaussianHMM | 观测服从高斯分布的HMM | 连续 |
hmm.GMMHMM | 观测服从混合高斯分布的HMM | 连续 |
hmm.MultinomialHMM | 观测为离散型的HMM | 离散 |
隐马尔科夫模型,要求隐变量为离散型随机变量,观测变量可以是离散型的也可以是连续型的
程序如下:
import numpy as np
from hmmlearn import hmm
# 隐状态集合Q
states = ['box1', 'box2', 'box3']
# 观测集合V
observations = ['black', 'white']
# 初始概率pi
start_probability = np.array([0.3, 0.5, 0.2])
# 状态转移矩阵A
transition_probability = np.array([
[0.4, 0.4, 0.2],
[0.3, 0.2, 0.5],
[0.2, 0.6, 0.2]
])
# 观测概率矩阵B
emission_probability = np.array([
[0.2, 0.8],
[0.6, 0.4],
[0.4, 0.6]
])
# 选用MultinomialHMM对离散观测状态建模
model = hmm.MultinomialHMM(n_components=len(states))
model.startprob_ = start_probability
model.transmat_ = transition_probability
model.emissionprob_ = emission_probability
# 观测序列
obervation_list = np.array([0, 1, 0])
# 调用维特比算法对观测序列进行隐含状态解码
logprob, box_list = model.decode(obervation_list.reshape(-1, 1), algorithm='viterbi')
# 对数最大路径概率
print(logprob)
# 输出解码的隐含状态序列
print(box_list)
for i in range(len(obervation_list)):
print(states[box_list[i]])
输出为:
-3.429596856183853
[1 2 1]
box2
box3
box2
可见,程序计算的结果与手工计算结果一致;
对于HMM的学习问题,HMM属于无监督学习,我们需要先设置HMM的隐状态数,再根据观测序列,由EM算法迭代更新模型参数 λ = ( π , A , B ) \lambda=(\pi,A,B) λ=(π,A,B)