由于第一次用python,所以代码可能会有许多缺陷,但是所有代码都用书中的例题进行了测试,结果正确。
这里想说一下python,在编写HMM过程中参看了之前写的MATLAB程序,发现他们有太多相似的地方,用到了numpy库,在python代码过程中最让我头疼的是数组角标,和MATLAB矩阵角标从1开始不同,numpy库数组角标都是从0开始,而且数组的维数也需要谨慎,一不小心就会出现too many indices for array的错误。程序中最后是维特比算法,在运行过程中出现了__main__:190: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future的警告,还没有去掉这个警告,查了一下说不影响结果,后面会去解决这个问题,下面贴出我的代码
其实代码就是翻译的公式,李航博士的书中有比较详细的推理过程,或者去找一些专业的论文文献进一步了解,这里仅仅是实现了最简单的应用,其应用实例如下:
输入数据格式:
In[117]:A
Out[117]:
array([[ 0.5, 0.2, 0.3],
[ 0.3, 0.5, 0.2],
[ 0.2, 0.3, 0.5]])
In[118]:B
Out[118]:
array([[ 0.5, 0.5],
[ 0.4, 0.6],
[ 0.7, 0.3]])
In[119]:Pi
Out[119]: array([[ 0.2, 0.4, 0.4]])
In[120]:O
Out[120]: array([[1, 2, 1]])
输出结果为:
In[101]:alpha,p = ForwardAlgo(A,B,Pi,O)
In[102]:alpha
Out[102]:
array([[ 0.1 , 0.077 , 0.04187 ],
[ 0.16 , 0.1104 , 0.035512],
[ 0.28 , 0.0606 , 0.052836]])
In[103]:p
Out[103]: 0.130218
In[104]:beta,p1 = BackwardAlgo(A,B,Pi,O)
In[105]:beta
Out[105]:
array([[ 0.2451, 0.54 , 1. ],
[ 0.2622, 0.49 , 1. ],
[ 0.2277, 0.57 , 1. ]])
In[106]:p1
Out[106]: 0.130218
In[107]:gamma = GetGamma(A,B,Pi,O)
In[108]:gamma
Out[108]:
array([[ 0.18822283, 0.31931069, 0.32153773],
[ 0.32216744, 0.41542644, 0.27271191],
[ 0.48960973, 0.26526287, 0.40575036]])
In[109]:xi = GetXi(A,B,Pi,O)
In[110]:xi
Out[110]:
array([[[ 0.1036723 , 0.04515505, 0.03939548],
[ 0.09952541, 0.18062019, 0.04202184],
[ 0.11611298, 0.1896512 , 0.18384555]],
[[ 0.14782903, 0.04730529, 0.12417638],
[ 0.12717136, 0.16956181, 0.11869327],
[ 0.04653735, 0.05584481, 0.16288071]]])
In[111]:a,b,pi = BaumWelchAlgo_n(A,B,Pi,O,5)
In[112]:a
Out[112]:
array([[ 0.43972438, 0.15395857, 0.40631705],
[ 0.309058 , 0.45055446, 0.24038754],
[ 0.3757005 , 0.50361975, 0.12067975]])
In[113]:b
Out[113]:
array([[ 0.50277235, 0.49722765],
[ 0.49524289, 0.50475711],
[ 0.91925551, 0.08074449]])
In[114]:pi
Out[114]: array([[ 0.08435301, 0.18040718, 0.73523981]])
In[115]:viterbi(A,B,Pi,O)
Delta矩阵:
array([[ 0.1 , 0.028 , 0.00756],
[ 0.16 , 0.0504 , 0.01008],
[ 0.28 , 0.042 , 0.0147 ]])
Psi矩阵:
array([[ 0., 3., 2.],
[ 0., 3., 2.],
[ 0., 3., 3.]])
最优路径概率:
0.014699999999999998
最优路径:
array([[ 3., 3., 3.]])
__main__:192: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future