隐马儿可夫模型:HMM,hidden Markov model,是可用于标注问题的统计学习模型,描述由隐藏的马尔可夫链随机生成观测序列的过程,属于生成模型。
隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再有各个状态生成一个观测而产生观测随机序列的过程。隐藏的马尔可夫链随机生成的状态的序列,称为状态序列。每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列。
HMM实例和包括的三个基本问题
隐马尔可夫模型由初始状态概率向量π,状态转移概率矩阵A和观测概率矩阵B决定。π和A决定状态序列,B决定观测序列,因此隐马尔科夫模型λ可以用三元符号表示,即λ=(A,B,π)。A,B和π称为隐马尔可夫的三要素。
关于例10.1 盒子和球模型
其中初始概率分布表示4个盒子,随机选取的时候每个盒子被选中的概率都是0.25。
隐马尔可夫模型的三个基本问题
(1)概率计算问题:前向-后向算法—>动态规划
给定模型λ=(A,B,π)和观测序列O={o1,02,…or},计算模型λ下观测序列O出现的概率P(O|λ).
(2)学习问题:Baum-Welch算法(状态未知)—>EM
已知观测序列O={o1,02,…or},估计模型λ=(A,B,π)的参数,使得在该模型下观测序列P(O|λ)最大
(3)预测问题:Viterbi算法—>动态规划
解码问题:已知模型λ=(A,B,π)和观测序列O={o1,02,…or},求给定观测序列条件概率P(I|O,λ)最大的状态序列I。
用前向-后向算法求HMM观测序列的概率
利用直接计算法,计算量很大,有效算法是:前向-后向算法。
1、前向概率和观测序列概率的前向算法
在例子10.2中,利用前向算法计算P(O|λ)中,计算初值里面,0.1,0.16,0.28分别0.5×0.2,0.4×0.4,0.7×0.4的得来的。
In [1]: import numpy as np
In [4]: def forward(obs_seq):
...: #前向算法
...: N = A.shape[0]
...: T = len(obs_seq)
...: #F保存前向概率矩阵
...: F = np.zeros((N,T))
...: F[:,0] = pi * B[:,obs_seq[0]]
...:
...: for t in range(1,T):
...: for n in range(N):
...: F[n,t] = np.dot(F[:,t-1],(A[:,n])) * B[n, obs_seq[t]]
...: return F
2、后向概率和观测序列概率的后向算法
In [1]: import numpy as np
In [6]: def backward(obs_seq):
...: #后向算法
...: N = A.shape[0]
...: T = len(obs_seq)
...: #X保存后向概率矩阵
...: X = np.zeros((N,T))
...: X[:,-1:] = 1
...: for t in reversed(range(T-1)):
...: for n in range(N):
...: X[n,t] = np.sum(X[:,t+1] * A[n,:] * B[:,obs_seq[t+1]])
...: return X
鲍姆-韦尔奇算法原理
鲍姆-韦尔奇(Baum-Welch)算法属于非监督学习算法,也是EM算法。属于学习算法。
维特比算法原理
维特比算法实际是用动态规划解隐马尔可夫模型预测问题,即用动态规划求概率最大路径。
参考链接:
王小草【机器学习】笔记--隐马尔可夫模型HMM
机器学习 基本概念】从朴素贝叶斯到维特比算法:详解隐马尔科夫模型
隐马尔科夫模型总结
隐马尔可夫链之基本原理
隐马尔科夫模型(HMM)一基本模型与三个基本问题
隐马尔科夫模型(HMM)及其Python实现
隐马尔科夫模型 介绍 HMM python代码
HMM.py
隐马尔科夫模型