一、HMM相关概念
二、前向传导
- #coding=utf-8
- import numpy as np
- #前向传导算法
- def Forward(A,B,Pi,O):
- n=O.shape[0]
- m=A.shape[0]
- dis2src=np.zeros((n,m),dtype=np.float32)#dis2src(i,j)用于保留第i层顶点j出现的概率
- dis2src[0,:]=Pi*(B[:,O[0]])#初始化第一层各个顶点与观测t=0的联合概率
- for t in range(n-1):
- t=t+1
- for i in range(m):
- predis=dis2src[t-1,:]
- #第t时刻的所有顶点,到t+1时刻顶点i的距离总和,然后再计算i顶点到观测变量O[t]的距离
- dis2src[t,i]=np.sum(predis*A[:,i])*B[i,O[t]]
- print sum(dis2src[t])
- A=np.asarray([0.5,0.2,0.3,0.3,0.5,0.2,0.2,0.3,0.5]).reshape(3,3)
- B=np.asarray([0.5,0.5,0.4,0.6,0.7,0.3]).reshape(3,2)
- Pi=np.asarray([0.2,0.4,0.4])
- O=np.asarray([0,1,0])
- Forward(A,B,Pi,O)
三、维比特算法实践
- #coding=utf-8
- import numpy as np
- #A为状态转移矩阵,B为观测矩阵,Pi为初始状态概率,o为观测序列
- #函数的目标就是返回0所对应的,状态序列
- def Viterbi(A,B,Pi,O):
- n=O.shape[0]
- m=A.shape[0]
- dis2src=np.zeros((n,m),dtype=np.float32)#dis2src(i,j)用于保留第i层顶点j,到原点的最大距离
- path=np.zeros((n,m),dtype=np.int)
- t=0;
- dis2src[t,:]=Pi*(B[:,O[t]])#初始化第一层顶点到原点的距离
- for t in range(n-1):
- t=t+1
- for i in range(m):
- predis=dis2src[t-1,:]
- #第t时刻的所有顶点,到t+1时刻顶点i的距离
- node_i2src=predis*A[:,i]
- dis2src[t,i]=np.max(node_i2src)*B[i,O[t]]
- path[t,i]=np.argmax(node_i2src);#计算顶点i对应到上一时刻的顶点的最大路径
- bestpaht=-1*np.ones(n,dtype=np.int)
- bestpaht[n-1]=(np.argmax(dis2src[n-1,:]))
- print np.log(np.max(dis2src[n-1,:]))
- #回溯
- for t in range(n-1)[::-1]:
- ti=path[t+1,bestpaht[t+1]]
- bestpaht[t]=ti
- print (bestpaht+1)
- A=np.asarray([0.333,0.333,0.333,0.333,0.333,0.333,0.333,0.333,0.333]).reshape(3,3)
- B=np.asarray([0.5,0.5,0.75,0.25,0.25,0.75]).reshape(3,2)
- Pi=np.asarray([0.333,0.333,0.333])
- O=np.asarray([0,0,0,0,1,0,1,1,1,1])
- Viterbi(A,B,Pi,O)