HMM_概率計算——forwar_algorithm實現
阿新 • • 發佈:2018-10-29
print pre 技術 pro 序列 定義 pri com int
一、前向算法(遞推)
1)觀測概率初值:
2)遞推:
3)終止:
二、理解前向算法
哈哈,先欠著,沒時間碼字!
三、代碼實現:
1 def getPro(): 2 iniStatePro=[] #初始狀態概率分布列表 3 pi=np.array(iniStatePro) 4 5 stateTransPro=[] #狀態轉移概率矩陣 N x N 6 A=np.array(stateTransPro) # A[a][b]: 狀態a -> 狀態b 的概率 78 observationPro=[] #觀測概率矩陣 N x M 9 B=np.array(observationPro) # B[a][o]:狀態a->觀測值o的概率 10 return A,B,pi; 11 12 def getForwardPro(A,B,pi,T,O): #O為觀測序列 13 alpha=np.zeros(shape=(T,len(A))) #定義前向概率 14 for i in range(len(B)): #初始化前向概率分布15 alpha[0][i]=pi[i]*B[ i ][ O[0] ] 16 17 for t in range(1,T): # 遞推 18 for i in range( len(A) ): # t時刻每個狀態 19 pro=0 20 for j in range( len(B) ): # 前一狀態到當前時刻 聯合概率 21 pro=pro+ A[j][i]*alpha[t-1][j]; 22 alpha[t][i]=pro*B[i][ O[t] ] #預測概率 23 OSeqBaseLambdaPro=sum( alpha[T-1] ); # p( O| lambda ) 24 return OSeqBaseLambdaPro;
四、驗證:統計學習方法 177 編程實現
1 def getPro(): 2 iniStatePro=[ 0.2 ,0.4, 0.4 ] #初始狀態概率分布列表 3個狀態 3 pi=np.array(iniStatePro) 4 5 stateTransPro=[[ 0.5,0.2,0.3 ],[ 0.3,0.5,0.2 ],[ 0.2, 0.3, 0.5 ]] #狀態轉移概率矩陣 N x N 6 A=np.array(stateTransPro) # A[a][b]: 狀態a -> 狀態b 的概率 7 8 observationPro=[[0.5,0.5],[0.4,0.6],[0.7,0.3]] #觀測概率矩陣 N x M [紅,白] 9 B=np.array(observationPro) # B[a][o]:狀態a->觀測值o的概率 10 11 return A,B,pi; 12 13 def getForwardPro(A,B,pi,T,O): #O為觀測序列 14 alpha=np.zeros(shape=(T,len(A))) #定義前向概率 15 for i in range(len(B)): #初始化前向概率分布 16 alpha[0][i]=pi[i]*B[ i ][ O[0] ] 17 18 for t in range(1,T): # 遞推 19 for i in range( len(A) ): # t時刻每個狀態 20 pro=0 21 for j in range( len(B) ): # 前一狀態到當前時刻 聯合概率 22 pro=pro+ A[j][i]*alpha[t-1][j]; 23 alpha[t][i]=pro*B[i][ O[t] ] #預測概率 24 OSeqBaseLambdaPro=sum( alpha[T-1] ); # p( O| lambda ) 25 return OSeqBaseLambdaPro; 26 27 A,B,pi=getPro(); 28 T=3 29 O=[0,1,0] 30 pro=getForwardPro(A,B,pi,T,O) 31 print(pro)
結果:
書上答案:0.13022
HMM_概率計算——forwar_algorithm實現