机器学习算法:隐马尔可夫算法

我是研究僧i 提交于 2019-11-27 12:10:52

隐马尔可夫算法

适用问题:标注问题的统计学习模型
模型类型:生成模型
模型特点:观测序列与状态序列联合概率分布模型
学习策略:极大似然估计、极大后验概率估计
学习的损失函数:对数似然函数
学习算法:概率计算公式、EM算法

总结:
1.隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态的序列,再由各个状态随机生成个观测序列的过程.
隐马尔可夫模型由初始状态概率向量n、状态转移概率矩阵A和观测概率矩阵B决定.因此,隐马尔可大模型可以写成h=(A,B,n).
隐马尔可夫模型是一个生成模型,表示状态序列和观测序列的联合分布,但是状态序列是隐藏的,不可观测的.
隐马尔可夫模型可以用于标注,这时状态对应着标记标注问题是给定观测序列预测其对应的标记序列.
2.概率计算问题.给定模型h=(A,B,n)和观测序列O= (01,02,03),计算在模型A下观测序列0出现的概率P(O|h).前向-后向算法是通过递推地计算前向-后向概率可以高效地进行隐马尔可夫模型的概率计算.
3.学习问题.已知观测序列O= (01,02,03),估计模型h=(A,B,n)参数,使得在该模型下观测序列概率P(O|h)最大.即用极大似然估计的方法估计参数. Baum-Welch算法,也就是EM算法可以高效地对隐马尔可夫模型进行训练.它是一种非监督学习算法,
4.预测问题.已知模型h=(A, B,n)和观测序列O= (01,02,03),求对给定观测序列条件概率P(I|0)最大的状态序列I.维特比算法应用动态规划高效地求解最优路径,即概率最大的状态序列.

思想:
隐马尔可夫模型是关于时序的概率模型; 描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列(state sequence),再由各个状态生成一个观测而产生观测随机序列(observation sequence )的过程。序列的每一个位置又可以看作是一个时刻。
#导入numpy并命名为np numpy是python中用于科学计算的一个库
import numpy as np
class HiddenMarkov:
#使用前向算法 O观测序列 Q状态序列 A状态转移概率 B预测概率矩阵 V观测集合
def forward(self,Q,V,A,B,O,PI):
N = len(Q) # 状态序列大小
M = len(O) # 观测序列大小
#zeros(shape, dtype=float, order=‘C’) 返回来一个给定形状和类型的用0填充的数组;
alphas = np.zeros((N,M))
T = M #有几个观测序列就有几个时刻
for t in range(T): #遍历每一时刻,算是 alpha 值
indexOfO = V.index(O[t]) #找出序列对应的索引
for i in range(N):
if t == 0: #计算初值
#a1(i)=pibi(o1) 初始状态i1=qi和观测o1的联合概率 alphas[i][t] //在i时刻的状态
alphas[i][t] = PI[t][i] * B[i][indexOfO]
print(‘alpha1(%d)=p%db%db(o1)=%f’ % (i, i, i, alphas[i][t]))
else:
#递推,对t=1,2,3,… 就是到时刻t观测到o1,o1,…ot并在时刻t处于状态qj而在时刻t+1到达状态qi的概率。
#执行矩阵乘法运算;
alphas[i][t] = np.dot([alpha[t-1] for alpha in alphas],[a[i] for a in A]) * B[i][indexOfO]
print(‘alpha%d(%d)=[sigma alpha%d(i)ai%d]b%d(o%d)=%f’ % (t, i, t - 1, i, i, t, alphas[i][t]))
P = np.sum([alpha[M-1] for alpha in alphas])
#终止
// alpha11 = pi[0][0] * B[0][0] #代表a1(1)
// alpha12 = pi[0][1] * B[1][0] #代表a1(2)
// alpha13 = pi[0][2] * B[2][0] #代表a1(3)

习题 10.1

Q = [1, 2, 3]
V = [‘红’, ‘白’]
A = [[0.5, 0.2, 0.3], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]]
B = [[0.5, 0.5], [0.4, 0.6], [0.7, 0.3]]
O = [‘红’, ‘白’, ‘红’, ‘白’]
PI = [[0.2, 0.4, 0.4]]
HMM = HiddenMarkov()
HMM.forward(Q, V, A, B, O, PI)

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!