ML - HMM 隐马尔科夫


马尔科夫模型

示例
在这里插入图片描述

天气变化种类:晴天,多云,雷雨,状态之间可以发生转换,昨天和今天转换的情况

在这里插入图片描述

今天能得到明天的情况,明天能得到后天的情况

这里我们就定义好了一个一阶马尔科夫模型:
状态:晴天,多云,雷雨
状态转换概率:三种天气状态间的转换概率
初始概率:晴天
第n天的天气只和 第n-1天有关

计算今天(t=1)的天气状况:
今天为晴天的概率=初始晴天概率X晴天转晴天概率 + 初始多云概率X多云转晴天概率 + 初始雷雨概率X雷雨转晴天概率


隐马尔科夫

示例:游戏难度加大了
我们漂到了一个岛上,这里没有天气预报,只有一片片的海藻。
这些海藻状态能观察到四种状态:Dry, Dryish, Damp, Soggy,海藻的状态跟天气的变换有一定的关系。

既然海藻是能看到的,那它就是观察状态,天气信息看不到就是隐藏状态。 观察状态 和 隐藏状态 并不是一一对应的。

隐马尔科夫:通过 观察状态 求解 隐藏状态。


Z:隐藏状态,X:观察状态

在这里插入图片描述

当前的隐藏状态只和前一状态有关: P ( Z t ∣ Z t − 1 , x t − 1 , Z t − 2 , x t − 2 , . . . , Z 1 , x 1 , ) = P ( Z t ∣ Z t − 1 ) P(Z_t | Z_{t-1}, x_{t-1}, Z_{t-2}, x_{t-2}, ..., Z_{1}, x_{1}, ) = P(Z_t | Z_{t-1}) P(ZtZt1,xt1,Zt2,xt2,...,Z1,x1,)=P(ZtZt1)
某个观察状态只和生成它的状态有关: P ( x t ∣ Z t , x t , Z t − 1 , x t − 1 , Z t − 2 , x t − 2 , . . . , Z 1 , x 1 , ) = P ( x t ∣ Z t ) P(x_t | Z_t, x_t, Z_{t-1}, x_{t-1}, Z_{t-2}, x_{t-2}, ..., Z_{1}, x_{1}, ) = P(x_t | Z_{t}) P(xtZt,xt,Zt1,xt1,Zt2,xt2,...,Z1,x1,)=P(xtZt)


隐马尔科夫模型的组成

三个必备:初始概率(π),隐藏状态转移 概率矩阵(A),生成 观测状态 概率矩阵(B)。
H M M = ( π , A , B ) HMM = (\pi, A, B) HMM=(π,A,B)

在这里插入图片描述


要解决的问题:

模型为 λ = ( A , B , π ) \lambda = (A, B, \pi) λ=(A,B,π)

  1. 给定模型 ( A , B , π ) (A, B, \pi) (A,B,π) 及 观测序列 O = o 1 , o 2 , . . . , o t O = {o_1, o_2,..., o_t} O=o1,o2,...,ot 计算其出现的概率 P ( O ∣   l a m b d a ) P(O | \ lambda) P(O lambda)
  2. 给定观测序列 O = o 1 , o 2 , . . . , o t O = {o_1, o_2,..., o_t} O=o1,o2,...,ot,求解参数 ( A , B , π ) (A, B, \pi) (A,B,π) 使得 P ( O ∣   l a m b d a ) P(O | \ lambda) P(O lambda) 最大;
  3. 已知模型 ( A , B , π ) (A, B, \pi) (A,B,π) 和观测序列 O = o 1 , o 2 , . . . , o t O = {o_1, o_2,..., o_t} O=o1,o2,...,ot,求状态序列,使得 P ( O ∣   l a m b d a ) P(O | \ lambda) P(O lambda) 最大。

暴力求解

我们要求的是在给定模型下观测序列出现的概率,那如果我能把 所有的隐藏序列都给列出来,也就可以知道联合概率分布 P ( O ∣   l a m b d a ) P(O | \ lambda) P(O lambda)

在这里插入图片描述


求观察序列的概率

在这里插入图片描述


前向算法

在这里插入图片描述

在这里插入图片描述


示例
有3个盒子,每个盒子都有红色和白色两种球,分别为:
盒子1: 5红5白
盒子2: 4红6白
盒子3: 7红3白

在这里插入图片描述

A 选几号盒子;A[0][0] = 0.5,前一次选一号盒子,第二次还选1号 的概率为 0.5;
B 盒子里球的颜色概率;B[0][0] = 0.5,一号盒子里红色球的概率为 0.5;

得到的观测序列: O = {红,白,红}
观测状态集合: V = {红,白},M = 2
隐藏状态集合: Q = {盒子1, 盒子2, 盒子3},N = 3


在这里插入图片描述

α ( 1 ) \alpha(1) α(1) 表示 上述在三个盒子,下一次还拿 盒子1 的概率,乘以 盒子1 里拿到红球的概率;以此类推。


在这里插入图片描述


求解参数


Baum-Welch 算法

给定观测序列 O = o 1 , o 2 , . . . , o t O = {o_1, o_2,..., o_t} O=o1,o2,...,ot,求解参数 ( A , B , π ) (A, B, \pi) (A,B,π) 使得 P ( O ∣   l a m b d a ) P(O | \ lambda) P(O lambda) 最大;

这回我们就要估计模型参数,但是由于状态序列未知,相当于是一个含有隐变量的参数估计问题,这就需要EM算法了。

Q函数是完全数据的对数似然函数 关于给定模型参数和观测变量的前提下 对隐变量的条件概率分布的期望,接下来只需要对它进行极大化。

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


维特比算法

https://www.zhihu.com/question/20136144


HMM 代码

http://hmmlearn.readthedocs.io/en/latest/

import numpy as np
from hmmlearn import hmm
#
 
# 隐藏状态:3个盒子
states = ["box 1", "box 2", "box3"]
n_states = len(states)
 
# 观测状态:2种球
observations = ["red", "white"]
n_observations = len(observations)

模型参数

start_probability = np.array([0.2, 0.4, 0.4])

transition_probability = np.array([
  [0.5, 0.2, 0.3],
  [0.3, 0.5, 0.2],
  [0.2, 0.3, 0.5]
])

emission_probability = np.array([
  [0.5, 0.5],
  [0.4, 0.6],
  [0.7, 0.3]
])

#用于离散观测状态
model = hmm.MultinomialHMM(n_components=n_states)

model.startprob_=start_probability
model.transmat_=transition_probability
model.emissionprob_=emission_probability

维特比算法,看到的是[0,1,0]

seen = np.array([[0,1,0]]).T
 
logprob, box = model.decode(seen, algorithm="viterbi")
 
# 得到的结果跟我们算的是一样的 
print (np.array(states)[box])  # ['box3' 'box3' 'box3']

predict也可以

box2 = model.predict(seen)
print (np.array(states)[box2]) #  ['box3' 'box3' 'box3']

得到观测序列的概率 ln0.13022≈−2.0385

print (model.score(seen)) # -2.03854530992

EM算法求解模型参数

tol : 停机阈值
n_iter : 最大迭代次数
n_components : 隐藏状态数目

model2 = hmm.MultinomialHMM(n_components=n_states, n_iter=20, tol=0.01)
X2 = np.array([[0,1,0,1],[0,0,0,1],[1,0,1,1]])
model2.fit(X2)

print ('startprob_',model2.startprob_)
print ('-----------------------------------------')
print ('transmat_',model2.transmat_)
print ('-----------------------------------------')
print ('emissionprob_',model2.emissionprob_)
print ('-----------------------------------------')
print ('score',model2.score(X2))
startprob_ [  1.00830546e-21   9.99155974e-01   8.44026026e-04]
-----------------------------------------
transmat_ [[  3.54305307e-01   4.25087407e-01   2.20607286e-01]
 [  9.66579437e-01   1.41083293e-04   3.32794799e-02]
 [  4.18739654e-01   1.17370397e-01   4.63889949e-01]]
-----------------------------------------
emissionprob_ [[ 0.10352942  0.89647058]
 [ 0.99860862  0.00139138]
 [ 0.80494989  0.19505011]]
-----------------------------------------
score -6.69039955756

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI工程仔

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值