隐马尔科夫模型例子(机器学习基础 HMM模型(隐马尔科夫))
推荐参考:https://juejin.cn/post/6844903891834781703
一 、马尔科夫链
在机器学习算法中 ,马尔可夫链(Markov chain)是个很重要的概念 。马尔可夫链(Markov chain) ,又称离散时间马尔可夫链(discrete-time Markov chain) ,因俄国数学家安德烈·马尔可夫(俄语:Андрей Андреевич Марков)得名 。
1. 简介
马尔科夫链即为状态空间中从一个状态到另一个状态转换的随机过程 。
该过程要求具备“无记忆 ”的性质:
下一状态的概率分布只能由当前状态决定 ,在时间序列中它前面的事件均与之无关 。这种特定类型的“无记忆性 ”称作马尔可夫性质 。马尔科夫链作为实际过程的统计模型具有许多应用 。
在马尔可夫链的每一步 ,系统根据概率分布 ,可以从一个状态变到另一个状态 ,也可以保持当前状态 。
状态的改变叫做转移 ,与不同的状态改变相关的概率叫做转移概率 。
马尔可夫链的数学表示为:
既然某一时刻状态转移的概率只依赖前一个状态 ,那么只要求出系统中任意两个状态之间的转移概率,这个马尔科夫链的模型就定了 。
2. 经典举例
下图中的马尔科夫链是用来表示股市模型 ,共有三种状态:牛市(Bull market), 熊市(Bear market)和横盘(Stagnant market)。
每一个状态都以一定的概率转化到下一个状态 。比如 ,牛市以0.025的概率转化到横盘的状态 。
这个状态概率转化图可以以矩阵的形式表示。 如果我们定义矩阵阵P某一位置P(i, j)的值为P(j|i),即从状态i变为状态j的概率 。 另外定义牛市 、熊市 、横盘的状态分别为0 、1 、2 ,这样我们得到了马尔科夫链模型的状态转移矩阵为:当这个状态转移矩阵P确定以后 ,整个股市模型就已经确定!
3. 小结
马尔科夫链即为 状态空间中从一个状态到另一个状态转换的随机过程 。 该过程要求具备“无记忆”的性质: 下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。二 、HMM简介
隐马尔可夫模型(Hidden Markov Model ,HMM)是统计模型 ,它用来描述一个含有隐含未知参数的马尔可夫过程 。
其难点是从可观察的参数中确定该过程的隐含参数 。然后利用这些参数来作进一步的分析 ,例如模式识别 。
1. 简单案例
下面我们一起用一个简单的例子来阐述:
假设我手里有三个不同的骰子 。 第一个骰子是我们平常见的骰子(称这个骰子为D6) ,6个面 ,每个面(1 ,2 ,3 ,4 ,5,6)出现的概率是1/6 。 第二个骰子是个四面体(称这个骰子为D4) ,每个面(1 ,2,3 ,4)出现的概率是1/4 。 第三个骰子有八个面(称这个骰子为D8) ,每个面(1,2 ,3 ,4 ,5 ,6 ,7 ,8)出现的概率是1/8 。 我们开始掷骰子 ,我们先从三个骰子里挑一个 ,挑到每一个骰子的概率都是1/3 。 然后我们掷骰子 ,得到一个数字,1 ,2 ,3,4 ,5 ,6,7 ,8中的一个 。不停的重复上述过程 ,我们会得到一串数字 ,每个数字都是1 ,2 ,3 ,4 ,5 ,6 ,7,8中的一个。 例如我们可能得到这么一串数字(掷骰子10次):1 6 3 5 2 7 3 5 2 4 这串数字叫做可见状态链 。但是在隐马尔可夫模型中 ,我们不仅仅有这么一串可见状态链 ,还有一串隐含状态链 。
在这个例子里,这串隐含状态链就是你用的骰子的序列。 比如 ,隐含状态链有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8一般来说 ,HMM中说到的马尔可夫链其实是指隐含状态链,因为隐含状态(骰子)之间存在转换概率(transition probability) 。
在我们这个例子里 ,D6的下一个状态是D4 ,D6 ,D8的概率都是1/3 。D4 ,D8的下一个状态是D4 ,D6 ,D8的转换概率也都一样是1/3。 这样设定是为了最开始容易说清楚 ,但是我们其实是可以随意设定转换概率的 。 比如 ,我们可以这样定义 ,D6后面不能接D4,D6后面是D6的概率是0.9 ,是D8的概率是0.1 。 这样就是一个新的HMM 。同样的 ,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability) 。
就我们的例子来说 ,六面骰(D6)产生1的输出概率是1/6 。产生2 ,3,4 ,5 ,6的概率也都是1/6 。 我们同样可以对输出概率进行其他定义 。比如 ,我有一个被赌场动过手脚的六面骰子 ,掷出来是1的概率更大 ,是1/2 ,掷出来是2 ,3 ,4 ,5,6的概率是1/10 。其实对于HMM来说 ,如果提前知道所有隐含状态之间的转换概率和所有隐含状态到所有可见状态之间的输出概率 ,做模拟是相当容易的 。但是应用HMM模型时候呢,往往是缺失了一部分信息的。
有时候你知道骰子有几种 ,每种骰子是什么 ,但是不知道掷出来的骰子序列; 有时候你只是看到了很多次掷骰子的结果,剩下的什么都不知道 。如果应用算法去估计这些缺失的信息 ,就成了一个很重要的问题 。这些算法我会在后面详细讲。
2. 三个基本问题
给定模型 ,如何有效计算产生观测序列的概率?换言之 ,如何评估模型与观测序列之间的匹配程度? 给定模型和观测序列 ,如何找到与此观测序列最匹配的状态序列?换言之 ,如何根据观测序列推断出隐藏的模型状态? 给定观测序列 ,如何调整模型参数使得该序列出现的概率最大?换言之 ,如何训练模型使其能最好地描述观测数据?前两个问题是模式识别的问题:1) 根据隐马尔科夫模型得到一个可观察状态序列的概率(评价);2) 找到一个隐藏状态的序列使得这个序列产生一个可观察状态序列的概率最大(解码) 。第三个问题就是根据一个可以观察到的状态序列集产生一个隐马尔科夫模型(学习) 。
对应的三大问题解法: 向前算法(Forward Algorithm) 、向后算法(Backward Algorithm) 维特比算法(Viterbi Algorithm) 鲍姆-韦尔奇算法(Baum-Welch Algorithm) (约等于EM算法)三 、HMM模型基础
1. 什么样的问题需要HMM模型
首先我们来看看什么样的问题解决可以用HMM模型。使用HMM模型时我们的问题一般有这两个特征:
1)我们的问题是基于序列的 ,比如时间序列 ,或者状态序列 。 2)我们的问题中有两类数据, 一类序列数据是可以观测到的 ,即观测序列; 而另一类数据是不能观察到的 ,即隐藏状态序列,简称状态序列 。有了这两个特征 ,那么这个问题一般可以用HMM模型来尝试解决 。这样的问题在实际生活中是很多的 。
比如:我现在给大家写课件 ,我在键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏状态序列 ,输入法的任务就是从敲入的一系列字符尽可能的猜测我要写的一段话 ,并把最可能的词语放在最前面让我选择 ,这就可以看做一个HMM模型了 。
再举一个 ,假如我上课讲课 ,我发出的一串连续的声音就是观测序列 ,而我实际要表达的一段话就是隐藏状态序列 ,你大脑的任务 ,就是从这一串连续的声音中判断出我最可能要表达的话的内容 。
从这些例子中 ,我们可以发现,HMM模型可以无处不在 。但是上面的描述还不精确 ,下面我们用精确的数学符号来表述我们的HMM模型 。
2. HMM模型的定义
对于HMM模型 ,首先我们假设Q是所有可能的隐藏状态的集合,V是所有可能的观测状态的集合 ,即:
Q
=
q
1
,
q
2
,
.
.
.
,
q
N
Q={q_1,q_2,...,q_N}
Q=q1,q2,...,qN V
=
v
1
,
v
2
,
.
.
.
v
M
V={v_1,v_2,...v_M}
V=v1,v2,...vM 其中 ,N是可能的隐藏状态数,M是所有的可能的观察状态数 。
对于一个长度为T的序列 ,i是对应的状态序列, O是对应的观察序列 ,即:
i
=
i
1
,
i
2
,
.
.
.
,
i
T
i={i_1,i_2,...,i_T}
i=i1,i2,...,iTO
=
o
1
,
o
2
,
.
.
.
o
T
O={o_1,o_2,...o_T}
O=o1,o2,...oT 其中 ,任意一个隐藏状态
i
t
∈
Q
i_t \in Q
it∈Q, 任意一个观察状态o
t
∈
V
o_t\in V
ot∈VHMM模型做了两个很重要的假设如下:
1) 齐次马尔科夫链假设。
即任意时刻的隐藏状态只依赖于它前一个隐藏状态 。
当然这样假设有点极端 ,因为很多时候我们的某一个隐藏状态不仅仅只依赖于前一个隐藏状态 ,可能是前两个或者是前三个 。
但是这样假设的好处就是模型简单 ,便于求解。
如果在时刻t的隐藏状态是
i
t
=
q
i
i_t=q_i
it=qi,在时刻t
+
1
t+1
t+1的隐藏状态是i
t
+
1
=
q
j
i_{t+1}=q_j
it+1=qj, 则从时刻t到时刻t+1的HMM状态转移概率a
i
j
a_{ij}
aij可以表示为: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)这样
a
i
j
a_{ij}
aij 可以组成马尔科夫链的状态转移矩阵A:A
=
[
a
i
j
]
N
×
N
A=[a_{ij}]_{N \times N}
A=[aij]N×N 2) 观测独立性假设 。
即任意时刻的观察状态只仅仅依赖于当前时刻的隐藏状态 ,这也是一个为了简化模型的假设 。
如果在时刻t的隐藏状态是
i
t
=
q
j
i_t=q_j
it=qj , 而对应的观察状态为o
t
=
v
k
o_t=v_k
ot=vk , 则该时刻观察状态v
k
v_k
vk 在隐藏状态q
j
q_j
qj 下生成的概率为b
j
(
k
)
b_j(k)
bj(k),满足:b
j
(
k
)
=
P
(
o
t
=
v
k
∣
i
t
=
q
j
)
b_j(k)=P(o_t=v_k|i_t=q_j)
bj(k)=P(ot=vk∣it=qj)这样
b
j
(
k
)
b_j(k)
bj(k)可以组成观测状态生成的概率矩阵B:B
=
[
b
j
(
k
)
]
N
×
M
B=[b_j(k)]_{N \times M}
B=[bj(k)]N×M 除此之外 ,我们需要一组在时刻t=1的隐藏状态概率分布
Π
\Pi
Π :Π
=
[
Π
i
]
N
\Pi =[\Pi_i]_N
Π=[Πi]N其中
Π
i
=
P
(
i
1
=
q
i
)
\Pi _i=P(i_1=q_i)
Πi=P(i1=qi)一个HMM模型 ,可以由隐藏状态初始概率分布
Π
\Pi
Π , 状态转移概率矩阵A和观测状态概率矩阵B决定。Π
\Pi
Π ,A决定状态序列,B决定观测序列 。因此 ,HMM模型可以由一个三元组
λ
\lambda
λ 表示如下:λ
=
(
A
,
B
,
Π
)
=
\lambda =(A,B, \Pi )=
λ=(A,B,Π)=(状态序列 ,观测序列,初始状态概率分布)3. 一个HMM模型实例
下面我们用一个简单的实例来描述上面抽象出的HMM模型 。这是一个盒子与球的模型 。
例子来源于李航的《统计学习方法》 。
假设我们有3个盒子 ,每个盒子里都有红色和白色两种球 ,这三个盒子里球的数量分别是:
按照下面的方法从盒子里抽球,开始的时候 , 从第一个盒子抽球的概率是0.2 , 从第二个盒子抽球的概率是0.4 , 从第三个盒子抽球的概率是0.4 。以这个概率抽一次球后 ,将球放回 。
然后从当前盒子转移到下一个盒子进行抽球 。规则是:
如果当前抽球的盒子是第一个盒子 ,则以0.5的概率仍然留在第一个盒子继续抽球 ,以0.2的概率去第二个盒子抽球 ,以0.3的概率去第三个盒子抽球 。 如果当前抽球的盒子是第二个盒子 ,则以0.5的概率仍然留在第二个盒子继续抽球 ,以0.3的概率去第一个盒子抽球,以0.2的概率去第三个盒子抽球 。 如果当前抽球的盒子是第三个盒子 ,则以0.5的概率仍然留在第三个盒子继续抽球 ,以0.2的概率去第一个盒子抽球,以0.3的概率去第二个盒子抽球。如此下去 ,直到重复三次 ,得到一个球的颜色的观测序列:
O={红,白 ,红}注意在这个过程中 ,观察者只能看到球的颜色序列 ,却不能看到球是从哪个盒子里取出的 。
那么按照我们前面HMM模型的定义 ,我们的观察状态集合是:
V={红 ,白} ,M=2我们的隐藏状态集合是:
Q={盒子1 ,盒子2 ,盒子3} ,N=3而观察序列和状态序列的长度为3.
初始状态分布
Π
\Pi
Π为:Π
=
(
0.2
,
0.4
,
0.4
)
T
\Pi=(0.2,0.4,0.4)^T
Π=(0.2,0.4,0.4)T
状态转移概率分布A矩阵为:观测状态概率B矩阵为:
4. HMM观测序列的生成
从上面的例子,我们也可以抽象出HMM观测序列生成的过程 。
输入的是HMM的模型
λ
=
(
A
,
B
,
Π
)
\lambda =(A,B,\Pi )
λ=(A,B,Π),观测序列的长度T
T
T输出是观测序列
O
=
o
1
,
o
2
,
.
.
.
o
T
O={o_1,o_2,...o_T}
O=o1,o2,...oT生成的过程如下:
1)根据初始状态概率分布\PiΠ生成隐藏状态
i
1
i_1
i12)for t from 1 to T
a. 按照隐藏状态i
t
i_t
it的观测状态分布b
i
t
(
k
)
b_{it}(k)
bit(k)生成观察状态o
t
o_t
ot b. 按照隐藏状态i
t
i_t
it 的状态转移概率分布a
i
t
,
i
t
+
1
ai_t, i_{t+1}
ait,it+1产生隐藏状态i
t
+
1
i_{t+1}
it+1 所有的
o
t
o_t
ot 一起形成观测序列O
=
o
1
,
o
2
,
.
.
.
o
T
O={o_1,o_2,...o_T}
O=o1,o2,...oT5. HMM模型的三个基本问题
HMM模型一共有三个经典的问题需要解决:
1)评估观察序列概率 —— 前向后向的概率计算
即给定模型λ
=
(
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} ,计算在模型λ
\lambda
λ 下某一个观测序列O出现的概率P(O|λ
\lambda
λ )。 这个问题的求解需要用到前向后向算法 ,是HMM模型三个问题中最简单的 。2)预测问题,也称为解码问题 ——维特比(Viterbi)算法
即给定模型λ
=
(
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,...%3创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!