1. 模型简介
隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,主要用于时序数据建模,它在语言识别,自然语言处理,模式识别等领域得到广泛的应用。
(1)状态变量 {y1,y2, ... ,yn},其中yi 属于 Y,表示第i个时刻的系统变量。
状态变量通常是隐藏的,不可被观测的,所以也称为隐变量。 设每个时刻可能有N种状态,取值范围是 {s1,s2, ... ,sN}.
(2)观测变量 {x1,x2, ... ,xn }, 其中xi属于X, 表示在第i时刻的观测值。观测变量可以取连续的值,也可取离散的值,此处仅考虑取离散值的情况。每个时刻的观测值可能有M种情况,取值范围为 {o1,o2, ... ,oM}。
(3)HMM的图结构
a. 在任意时刻,观测变量的取值仅依赖于状态变量,即xt由yt决定
b. t时刻的状态yt仅依赖于t-1时刻的状态yt-1,这就是所谓的马尔科夫链。
基于这种依赖关系,所有变量的联合概率分布为:
(4)三组参数:除了结构信息,要确定一个HMM,还需要以下三组参数
a. 状态转移概率 A = [aij]N*N, 其中aij = P(yt+1 = sj | yt = si)
即代表任意时刻t, 若状态为si,则下一状态为sj的概率。
b. 输出观测概率:B = [bij]N*M, 其中bij = P(xt = oj | yt = si)。
即代表任意时刻t,若状态为si, 则观测值oj被获取的概率。
c. 初始状态概率:π = (π1,π2, ... ,πN), 其中πi = P(y1 = si)
通常可以用其参数λ = [A, B, π]来指代。
(5)实际应用种的三个基本问题:
第一个:给定模型λ = [A, B, π],如何有效计算其产生的观测序列X = {x1,x2, ... ,xn }的概率P(X | λ)?换言之,如何评估模型与观测序列之间的匹配程度?
第二个: 给定模型λ = [A, B, π]和观测序列X = {x1,x2, ... ,xn },如何找到与此观测序列最匹配的状态序列Y = {y1,y2, ... ,yn} ? 换言之,如何根据观测序列推断出隐藏的模型状态 ?
第三个: 给定观测序列X = {x1,x2, ... ,xn },如何调整模型参数λ = [A, B, π] 使得序列出现的概率P(X | λ)最大?换言之,如何训练模型使其能最好地描叙观测数据?
2. 用前向算法求HMM观测序列的概率P(X | λ):即针对解决第一个应用问题。
(1)简介:
前向算法本质上属于动态规划的算法,也就是我们要通过找到局部状态递推的公式,这样一步步的从子问题的最优解拓展到整个问题的最优解。
在前向算法中,通过定义“前向概率”来定义动态规划的这个局部状态。什么是前向概率呢, 其实定义很简单:定义时刻 t时隐藏状态为si, 观测状态的序列为o1,o2,...ot的概率为前向概率。记为: si,o1,o2,...,ot. 设观测变量为x,隐含变量为y, 则
αt(i) = P(o1,o2,...,ot,yt=si | λ)
既然是动态规划,我们就要递推了,现在我们假设我们已经找到了在时刻
t时各个隐藏状态的前向概率,现在我们需要递推出时刻t+1时各个隐藏状态的前向概率。
(2)具体计算过程如下:
输入:HMM模型λ = [A, B, π],观测序列(真实观测到的值)O = {o1,o2, ..., oT}
输出:观测序列概率P(O | λ)
1) 计算时刻1的各个隐藏状态前向概率:初始状态取第i个时,观测值为o1的概率。
α1(i) = πi * bi(o1), i = 1,2,...N
其中bi(o1) = P(xt = o1 | yt = si)
2) 递推时刻2,3,...T的前向概率:
其中N是隐变量可能取值的个数。
3) 计算最终结果:
从递推公式可以看出,我们的算法时间复杂度是O(TN2)
参考文献:周志华 《机器学习》
http://www.cnblogs.com/pinard/p/6955871.html