首先通过计算以下给定的HMM模型中,求出三天观察是(Dizzy,Cold,Normal)的概率是多少来感受HMM的计算过程。
上图HMM模型的参数对应如下形式:
trainsition_probability = [[0.7,0.3],[0.4,0.6]]转移矩阵
emission_probability = [[0.5,0.4,0.1],[0.1,0.3,0.6]]发射矩阵
pi = [0.6,0.4]初始化概率
通常在计算的过程中就能感受到,我们是通过递推的方法进行计算,而非采用暴力法求解。也即我们无意中就使用了HMM的前向算法。但我们还是分析下暴力算法的计算复杂度。假设状态值是N个,观察值是K个,总共观察长度为T。则使用暴力法求解的过程是:枚举出所有T长度的所有状态转移序列,计算每个序列产生指定观测序列的概率,累加。计算复杂度约为:
N
T
∗
T
N^T*T
NT∗T。
计算复杂度太高,这我们忍不了!上高级算法!
前向算法
先给出定义:
前向概率:给定隐马科夫模型 λ \lambda λ,定义到时刻t为止的观测序列为 o 1 , o 2 , o 3 , . . . o t {o_1},{o_2},{o_3},...{o_t} o1,o2,o3,...ot ,且状态为 q i {q_i} qi的概率为前向概率,记作
α t ( i ) = P ( o 1 , o 2 , o 3 , . . . o t , i t = q i ∣ λ ) {\alpha _t}\left( i \right) = P\left( {{o_1},{o_2},{o_3},...{o_t},{i_t} = {q_i}|\lambda } \right) αt(i)=P(o1,o2,o3,...ot,it=qi∣λ)