马尔可夫过程:谈到 HMM,首先简单介绍一下马尔可夫过程 (Markov Process),它因俄罗斯数学家安德烈·马尔可夫而得名,代表数学中具有马尔可夫性质的离散随机过程。该过程中,每个状态的转移只依赖于之前的 n 个状态,这个过程被称为1个 n 阶的模型,其中 n 是影响转移状态的数目。最简单的马尔科夫过程就是一阶过程,每一个状态的转移只依赖于其之前的那一个状态。注意这和确定性系统不一样,因为这种转移是有概率的,而不是确定性的。
马尔可夫链是随机变量 X1, … , Xn 的一个数列。这些变量的范围,即他们所有可能取值的集合,被称为“状态空间”,而 Xn 的值则是在时间 n 的状态。如果 Xn+1 对于过去状态的条件概率分布仅是 Xn 的一个函数,则
这里 x 为过程中的某个状态。上面这个恒等式可以被看作是马尔可夫性质
HMM的三个假设:对 HMM 来说,有如下三个重要假设,尽管这些假设是不现实的。
假设1:马尔可夫假设(状态构成一阶马尔可夫链)
假设2:不动性假设(状态与具体时间无关)
假设3:输出独立性假设(输出仅与当前状态有关)
隐藏的状态和可观察到的状态之间有一种概率上的关系,也就是说某种隐藏状态 H 被认为是某个可以观察的状态 O1 是有概率的,假设为 P(O1 | H)。如果可以观察的状态有3种,那么很显然 P(O1 | H)+P(O2 | H)+ P(O3 |H) = 1。
HMM的五要素: { N, M, π,A,B } 表示,其中 N 表示隐藏状态的数量,我们要么知道确切的值,要么猜测该值,M 表示可观测状态的数量,可以通过训练集获得, π={πi} 为初始状态概率,A={aij} 为隐藏状态的转移矩阵 Pr(xt(i) | xt-1(j)),B={bik} 表示某个时刻因隐藏状态而可观察的状态的概率,即混淆矩阵,Pr(ot(i) | xt(j))。在状态转移矩阵和混淆矩阵中的每个概率都是时间无关的,即当系统演化时,这些矩阵并不随时间改变。对于一个 N 和 M 固定的 HMM 来说,用 λ={ π, A, B }表示 HMM 参数
HMM的三个应用:
第一:已知模型λ={ π, A, B }和观测的序列,求出该模型得到该序列的概率.(注意也可以找到得到这个观测序列的最佳的隐状态的序列 )
此时的 关键就是知道该观测序列对应的隐藏状态序列,知道了这个隐藏的就可以根据各个隐藏装填序列到输出的公式连乘得到我们的概率了。
所以这个时候有两种办法,第一种就是暴力法,排列出所有的状态序列(注意序列可重复),然后计算概率,加载一起就行了。第二种是:前向算法来计算在某个特定的 HMM 下一个可观察状态序列的概率,然后据此找到最可能的模型。这个方法其实很简单就是一个递归的算法,每一次递归就计算出从上一次结果到这一次结果的概率,这样每次不用计算开头,直接计算上一次就行了,本次记过只有上一次决定,从而降低复杂率,从而也得到了中间最好的模型。(可以倒推出来,也就是说,最后一个隐藏状态肯定是N个,这N 个都有可能到我们的观测序列,但是因为知道了从开始到达了该时刻N个状态各个状态的概率,然后其实就是最大概率那一个就是最好的模型,而该模型得到这个序列的所有概率也就知道了)
注意暴力法则,穷搜索的复杂都是,而递归方法的复杂度是*T
第二:根据可观察状态的序列找到一个最可能的隐藏状态序列。该问题的前提也是有一个HMM模型,其实该问题和上一个问题是一样的,不同的是上次的目的是找到所以路径的概率和,这次的目的是在所有路径中找到一个最好的最大概率也就是最佳路径。(该算法其实就是一个动态规划的解法而已)
第一个方法还是暴力法,其实刚才已经说了能找到最佳的隐藏序列了,这个部分具有重复性。
第二方法就是Viterbi 算法
第三: 根据观察到的序列集来找到一个最有可能的 HMM。 (个人理解 这个就是一个训练的过程)在很多实际的情况下,HMM 不能被直接的判断,这就变成了一个学习问题,因为对于给定的可观察状态序列 O 来说,没有任何一种方法可以精确地找到一组最优的 HMM 参数 λ 使 P(O | λ) 最大,于是人们寻求使其局部最优的解决办法,而前向后向算法(也称为Baum-Welch算法)就成了 HMM 学习问题的一个近似的解决方法。
这个有点像BP神经网络,通过前向得到模型,通过后向来更新参数。是EM算法的一重特殊表达。
参考博客:
http://blog.chinaunix.net/uid-26715658-id-3453274.html 隐马尔可夫模型(HMM)攻略
http://www.cnblogs.com/androidme/archive/2012/03/06/2381760.html 隐马尔可夫模型(HMM)攻略