**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)