隐马尔科夫模型框架及python实现

                                              **NLP学习笔记(隐马尔可夫模型)**

关于隐马尔科夫模型,主要是包含五大要素(以天气和锻炼为例)
①隐状态 {Rainy,Sunny}
②显状态{Run,Gym,Rest}
③初状态{Rainy:0.6, Sunny:0.4}
④转换概率(矩阵表示)
transition_probability = {
‘Rainy’ : {‘Rainy’: 0.7, ‘Sunny’: 0.3},
‘Sunny’ : {‘Rainy’: 0.4, ‘Sunny’: 0.6},
}
[[0.7,0.3]
[0.4,0.6]]
⑤输出概率
{‘Rainy’:{‘Run’: 0.2, ‘Gym’ : 0.7,‘Rest’ : 0.1}
‘Sunny’: {‘Run’ : 0.8,‘Gym’ : 0.1,‘Rest’:0.1}
}
Question:求解最可能3天的隐态序列(求最可能的天气序列)?
PS:第一天进行的项目的是 长跑
①第一天
晴天概率: P(Sunny)* P(Run|Sunny) = 0.4 * 0.8 = 0.32
雨天概率: P(Rainy)* P(Run|Rainy) = 0.6 * 0.2 = 0.12
所以第一天更大概率是晴天
②从第二天开始,对于每天的天气皆有 P(昨天某一种天气)* P(昨天天气----->现在天气)* P(现在天气|当前活动) 。通过和①同样的比较方法实现对现在天气的预测,最后选择最后一天概率较大天气的隐序列。

以下为代码实现:

#关于马尔科夫模型的实现

#隐状态 {Rainy,Sunny} 显状态{Run,Gym,Rest}

from numpy import*
import numpy as np
def two_steps(P_2_Sunny, P_2_Rainy,act):
       if act == 0:
              P_Sunny_1 = P_2_Sunny * 0.6 * 0.8
              P_Sunny_2 = P_2_Rainy  * 0.3 * 0.8
              if P_Sunny_1 < P_Sunny_2:
                     P_Sunny_1 = P_Sunny_2
              P_Rainy_1 = P_2_Sunny * 0.4 * 0.2
              P_Rainy_2 = P_2_Rainy * 0.7 * 0.2
              if P_Rainy_1 < P_Rainy_2:
                     P_Rainy_1 = P_Rainy_2
       if act == 1:
              P_Sunny_1 = P_2_Sunny * 0.6 * 0.1
              P_Sunny_2 = P_2_Rainy  * 0.3 * 0.1
              if P_Sunny_1 < P_Sunny_2:
                     P_Sunny_1= P_Sunny_2
              P_Rainy_1 = P_2_Sunny * 0.4 * 0.7
              P_Rainy_2 = P_2_Rainy * 0.7 * 0.7
              if P_Rainy_1 < P_Rainy_2:
                     P_Rainy_1 = P_Rainy_2
       if act == 2:
              P_Sunny_1 = P_2_Sunny * 0.6 * 0.1
              P_Sunny_2 = P_2_Rainy  * 0.3 * 0.1
              if P_Sunny_1 < P_Sunny_2:
                     P_Sunny_1 = P_Sunny_2
              P_Rainy_1 = P_2_Sunny * 0.4 * 0.1
              P_Rainy_2 = P_2_Rainy * 0.7 * 0.1
              if P_Rainy_1 < P_Rainy_2:
                     P_Rainy_1 = P_Rainy_2
       return P_Sunny_1,P_Rainy_1

Instate = []
P_berain = 0.6
P_besunny = 0.4 #起始隐状态

#显状态数组 Run : 0 , Gym  : 1, Rest :2
Out_state = [2,1,2,0,1,2,0]
#转化矩阵
E_1 = mat([[0.7, 0.3],
       [0.4,0.6]])
# 输出矩阵
E_2 = mat([[0.2,0.7,0.1],
       [0.8,0.1,0.1]])
#第一天
P_Sunny = 0.4 * 0.8
P_Rainy = 0.6 * 0.2
Instate.append('Sunny')

#第二天之后
for i in range(len(Out_state)- 1):
       P_Sunny,P_Rainy = two_steps(P_Sunny,P_Rainy,2)
       if P_Sunny > P_Rainy:
              Instate.append('Sunny')
       else:
              Instate.append('Rainy')
print(Instate)
 注:更为详细资料可见[https://www.cnblogs.com/skyme/p/4651331.html](h

输出结果:['Sunny', 'Sunny', 'Sunny', 'Sunny', 'Rainy', 'Rainy', 'Rainy']
ttps://www.cnblogs.com/skyme/p/4651331.html)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值