面对越来越复杂的问题,传统的概率方法显得越来越力不从心。
概率图模型用图表示变量相关关系的概率模型。
- 贝叶斯网络:有向无环图
- 马尔可随机场:无向图
#HMM_weather
import numpy as np
startP = np.array([0.63,0.17,0.20]) #初始状态 分别为晴天、阴天、雨天的概率分布
trans_P = np.array([[0.5,0.375,0.125], #状态转移矩阵
[0.25,0.125,0.625], #4.7
[0.25,0.375,0.375]])
emitP = np.array([[0.6,0.20,0.05], #发射(输出)概率矩阵
[0.25,0.25,0.25], #4.8混淆矩阵
[0.05,0.10,0.50]])
#第一天(初始)天气预测:初始状态乘以发射概率
#第二天天气预测:前一状态乘以状态转移矩阵再乘以发射概率
#第三天天气预测:前一状态乘以状态转移矩阵再乘以发射概率
#当前时刻状态(隐状态)由上一时刻状态(转移概率已定)和发射(输出)概率决定
#第一天天气(第一天观测状态为干旱)预测概率=初始状态*发射概率矩阵
state1emit = startP*emitP[:,0]
#第二天前一状态*状态转移矩阵(第一天天气预测概率*转移概率矩阵)(np.dot:矩阵乘法)
state2_mid = np.dot(state1emit,trans_P)
#第二天天气(第二天观测状态为干燥)预测概率
state2emit = state2_mid*emitP[:,1]
state3_mid = np.dot(state2emit,trans_P) #第二天天气预测概率乘以转移概率矩阵
state3emit = state3_mid*emitP[:,2] #第三天天气预测概率
#第一天天气值
#第二天天气值
#第三天天气值
# argmax()取最大参数位置
state1 = state1emit.argmax()
state2 = state2emit.argmax()
state3 = state3emit.argmax()
print(state1emit)
print(state2emit)
print(state3emit)
print(state1,state2,state3)
# viterbi_weathaer
import numpy as np
# obs: 观察状态
# states:真实(隐)状态
# startP:初始状态/概率
# transP:转移概率(隐状态)
# emitP :发射(输出)概率
startP = np.array([0.63,0.17,0.20]) #初始状态
transP = np.array([[0.5, 0.375, 0.125], #状态转移矩阵
[0.25, 0.125, 0.625],
[0.25, 0.375, 0.375]])
emitP = np.array([[0.6, 0.20, 0.05], #发射(输出)概率矩阵
[0.25, 0.25, 0.25],
[0.05, 0.10, 0.50]])
state1emit = startP*emitP[:,0] #第一天天气预测概率
#运用列表推导式
#使用np.array将列表转化为数组
state2emit = np.array([max(state1emit*transP[:,i])*emitP[i,1] for i in range(3)]) #第二天天气预测概率
state3emit = np.array([max(state2emit*transP[:,i])*emitP[i,2] for i in range(3)]) #第三天天气预测概率
#第一天天气值
#第二天天气值
#第三天天气值
state1 = state1emit.argmax()
state2 = state2emit.argmax()
state3 = state3emit.argmax()
print(state1emit)
print(state2emit)
print(state3emit)
print(state1,state2,state3)
在中文分词中,由于上下文语境常常没有考虑在内,分词结果常不佳。
将Viterbi算法用在 HMM针对中文分词应用中可规避此类问题。