首页 >> 大全

机器学习笔记Python笔记:HMM(隐马尔科夫模型)

2023-11-06 大全 26 作者:考证青年

1 引子:猜天气小游戏

一对异地恋的情侣,女朋友想根据男友的心情猜测男友所在城市的天气

1.1 天气和心情一定一一对应

可以根据心情唯一确定天气

1.2 天气和心情没有一一对应

1.3天气和心情没有一一对应+连续两天的天气之间有转换概率 天气的转换概率

2 HMM( model)隐马尔科夫模型 2.1 四个重要的概念 隐藏状态 转换概率 输出概率

——>上述1.3的问题,可以写成如下的HMM形式:

3 HMM的几个核心问题 3.1 估计转换概率和输出概率 3.1.1 转换概率

_隐式马尔可夫模型_隐马尔科夫模型的两个基本假设

收集历史数据,统计各种天气状态转换的数量

比如收集了16天的天气:

分别统计 (晴天->晴天,晴天——>雨天),(雨天——>雨天,雨天——>晴天)的个数,分别计算概率(每一组的概率之和为1)

3.1.2 输出概率

和3.1.1 类似,也是收集数据,通过数量统计估计概率

也是收集16天的数据:

分别统计(晴天——>高兴、晴天——>烦躁);(雨天——>高兴、雨天——>烦躁)的个数,计算概率(每一组的概率之和为1)

3.2 不知道男友情绪(不知道观测值),如果估计晴天和雨天?

此时我们知道的只是隐藏状态的转换概率:

隐马尔科夫模型的两个基本假设_隐式马尔可夫模型_

如果今天是雨天,那么有0.6的概率昨天也是雨天,有0.2的概率昨天是晴天 今天只有可能是晴天或者雨天的一种,所以S+R=1——>S=2/3,R=1/3,即不知道男友心情是,推断当地天气是晴天和雨天的概率分别是2/3和1/3 3.3 只考虑一天,知道男友心情,推断当地天气

3.4 知道连续几天的心情,推断连续几天的天气 3.4.1 穷举法 以上述四种排列组合种的(晴天-雨天)为例,计算一下出现这种天气排列组合方式的概率 穷举四种排列组合,分别计算他们的概率,概率最大的一个就是最有可能的天气组合(这里是晴天-晴天) 穷举法的问题是,如果需要推断连续n天的天气情况,需要2^n个排列组合结果的概率都算一遍,开销很大 3.4.2 维特比算法

比如现在的心情是高兴-高兴-烦躁-烦躁-烦躁-高兴,我们需要推断可能的天气链 第二天 第二天是雨天的概率同理: 第三天 第三天是雨天的概率 ——>第三天是晴天or雨天的概率分别是0.05456,0.04092第四天 第四天是雨天的概率 ——>第四天是晴天or雨天的概率分别是0.0087,0.0147第五天 第五天是雨天的概率 第五天是晴天or雨天的概率分别是0.0014,0.0053第六天 第六天是雨天的概率 沿着日期,找出每天晴天雨天概率中较大的那个,连成一条线,就是估计的天气链 总结一下:

4 实现 4.1 数据部分

p_s=2/3
p_r=1/3
p_init=[p_s,p_r]
#不考虑心情的话,单天晴天or雨天的概率(初始概率)p_ss=0.8
p_sr=0.2
p_rs=0.4
p_rr=0.6
p_transition=[p_ss,p_sr,p_rs,p_rr]
#转换概率(左先右后)p_sh=0.8
p_sg=0.2
p_rh=0.4
p_rg=0.6
p_output=[p_sh,p_sg,p_rh,p_rg]
#输出概率observation=['H', 'H', 'G', 'G', 'G', 'H']
#男友的心情,观测值state=['S','R']
#隐藏状态ob_state=['H','G']
#观测状态

4.2 维特比算法

import numpy as np
def viterbi(observation,p_init,p_transition,p_output,state,ob_state):n_state=len(state)n_seq_len=len(observation)weather_prob=np.zeros((n_seq_len,n_state))#每个时刻不同状态的概率state_index=ob_state.index(observation[0])for i in range(n_state):weather_prob[0][i]=max(weather_prob[0][i],p_init[i]*\p_output[i*n_state+state_index])#第一天各状态的概率for i in range(1,n_seq_len):state_index=ob_state.index(observation[i])for j in range(n_state):for k in range(n_state):weather_prob[i][j]=max(weather_prob[i][j],weather_prob[i-1,k]*\p_transition[k*n_state+j]*\p_output[j*n_state+state_index])#后续每天各状态的概率weather=[]for i in range(n_seq_len):weather.append(state[np.argmax(weather_prob[i])])#每天的推测状态,取决于这一天概率最大的那个状态return weather_prob,weather

4.3 测试结果

viterbi(observation,p_init,p_transition,p_output,state,ob_state)
'''
(array([[0.53333333, 0.13333333],[0.34133333, 0.04266667],[0.05461333, 0.04096   ],[0.00873813, 0.0147456 ],[0.0013981 , 0.00530842],[0.00169869, 0.00127402]]),['S', 'S', 'S', 'R', 'R', 'S'])
'''

参考内容:小孩都看得懂的 HMM ()

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了