摘要:狀態轉移,發射概率逐次計算每個序列節點的所有狀態下的概率值,最大概率值對應的。應用狀態轉移求解最佳轉移路徑。狀態轉移矩陣的作用在于在每個狀態轉移概率計算時,和固有的狀態轉移矩陣進行加和,再計算。
viterbi過程 1.hmm類似。 狀態轉移,發射概率 2.逐次計算每個序列節點的所有狀態下的概率值,最大概率值對應的index。 3.概率值的計算,上一個節點的概率值*轉移概率+當前概率值。 4.最后取出最大的一個值對應的indexes 難點: 理解viterbi的核心點,在于每個時間步都保留每一個可視狀態,每一個可視狀態保留上一個時間步的最大隱狀態轉移, 每一個時間步t記錄上一個最大概率轉移過來的時間步t-1的信息,包括index/概率值累積。 迭代完時間步,根據最后一個最大累積概率值,逐個往前找即可。 根據index對應的狀態逐個往前找。 應用: 狀態轉移求解最佳轉移路徑。 只要連續時間步,每個時間步有狀態分布,前后時間步之間有狀態轉移,就可以使用viterbi進行最佳狀態轉移計算求解。 狀態轉移矩陣的作用在于 在每個狀態轉移概率計算時,和固有的狀態轉移矩陣進行加和,再計算。相當于額外的概率添加。
import numpy as np def viterbi_decode(score, transition_params): """ 保留所有可視狀態下,對seqlen中的每一步的所有可視狀態情況下的中間狀態求解概率最大值,如此 :param score: :param transition_params: :return: """ # score [seqlen,taglen] transition_params [taglen,taglen] trellis=np.zeros_like(score) trellis[0]=score[0] backpointers=np.zeros_like(score,dtype=np.int32) for t in range(1,len(score)): matrix_node=np.expand_dims(trellis[t-1],axis=1)+transition_params #axis=0 代表發射概率初始狀態 trellis[t]=score[t]+np.max(matrix_node,axis=0) backpointers[t]=np.argmax(matrix_node,axis=0) viterbi=[np.argmax(trellis[-1],axis=0)] for backpointer in reversed(backpointers[1:]): viterbi.append(backpointer[viterbi[-1]]) viterbi_score = np.max(trellis[-1]) viterbi.reverse() print(trellis) return viterbi,viterbi_score def calculate(): score = np.array([[1, 2, 3], [2, 1, 3], [1, 3, 2], [3, 2,1]]) # (batch_size, time_step, num_tabs) transition = np.array([ [2, 1, 3], [1, 3, 2], [3, 2, 1] ] )# (num_tabs, num_tabs) lengths = [len(score[0])] # (batch_size, time_step) # numpy print("[numpy]") # np_op = viterbi_decode( score=np.array(score[0]), transition_params=np.array(transition)) # print(np_op[0]) # print(np_op[1]) print("=============") # tensorflow # score_t = tf.constant(score, dtype=tf.int64) # transition_t = transition, dtype=tf.int64 tf_op = viterbi_decode( score, transition) print("--------------------") print(tf_op) if __name__=="__main__": calculate()
// java 版本 import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; public class viterbi { public static int[] viterbi_decode(double[][]score,double[][]trans ) { //score(16,31) trans(31,31) int path[] = new int[score.length]; double trellis[][] = new double[score.length][score[0].length]; int backpointers[][] = new int [score.length][score[0].length]; trellis[0] = score[0]; for(int t = 1; tmax_column) { max_column = v[i][j]; line_point = i; } } max_v[j] = max_column; max_v_linepoint[j] = line_point; } for(int i = 0 ;i < score[0].length; i++ ) { trellis[t][i] = score[t][i] + max_v[i]; backpointers[t][i] = max_v_linepoint[i]; } } int viterbi[] = new int[score.length]; // List viterbi = new ArrayList<>(); double max_trellis = trellis[score.length-1][0]; for(int j = 0; j< trellis[score.length-1].length ;j++) { if(trellis[score.length-1][j] > max_trellis) { max_trellis = trellis[score.length-1][j]; // viterbi.add(j); viterbi[0] = j; } } for(int i=1;i< 1+(backpointers.length)/2;i++){ int temp[] = backpointers[i]; backpointers[i] = backpointers[backpointers.length-i]; backpointers[backpointers.length-i]=temp; } for(int i = 1; i < backpointers.length; i++ ) { // viterbi.add( backpointers[i][viterbi.get(viterbi.size() - 1)]); viterbi[i] = backpointers[i][viterbi[i-1]]; } for(int i = 0;i < (viterbi.length)/2; i++){ //把數組的值賦給一個臨時變量 int temp = viterbi[i]; viterbi[i] = viterbi[viterbi.length-i-1]; viterbi[viterbi.length-i-1] = temp; } return viterbi; } public static void main(String[] args){ List > score=new ArrayList<>(); ArrayList
row1=new ArrayList<>(); row1.add(1); row1.add(2); row1.add(3); ArrayList row2=new ArrayList<>(); row2.add(2); row2.add(1); row2.add(3); ArrayList row3=new ArrayList<>(); row3.add(1); row3.add(3); row3.add(2); ArrayList row4=new ArrayList<>(); row4.add(3); row4.add(2); row4.add(1); score.add(row1); score.add(row2); score.add(row3); score.add(row4); List > trans=new ArrayList<>(); ArrayList
row11=new ArrayList<>(); row11.add(2); row11.add(1); row11.add(3); ArrayList row12=new ArrayList<>(); row12.add(1); row12.add(3); row12.add(2); ArrayList row13=new ArrayList<>(); row13.add(3); row13.add(2); row13.add(1); trans.add(row11); trans.add(row12); trans.add(row13); // double[][] score_double=(double[][]) score.toArray(); // double[][] trans_double=(double[][]) trans.toArray(); System.out.println(score); System.out.println(trans); double[][] score_double=new double[score.size()][score.get(0).size()]; for(int i=0;i
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43429.html
摘要:題目闡釋算法實現。用實現的和表現層的轉移動態規劃問題,歸結到相鄰兩個之間存在轉移概率,轉移概率。難點三層循環,為了保留,計算每個的的概率,所以要嵌套在之外。 題目闡釋: viterbi算法實現。 用python實現viterbi的hidden state 和 表現層的轉移 動態規劃問題,歸結到 相鄰兩個step之間存在 state轉移概率,state2emibission轉移概...
摘要:算法中的馬氏鏈轉移以上采樣過程中,如圖所示,馬氏鏈的轉移只是輪換的沿著坐標軸軸和軸做轉移,于是得到樣本馬氏鏈收斂后,最終得到的樣本就是的樣本,而收斂之前的階段稱為。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/278... 本文是整理網上的幾篇博客和論文所得出來的,所有的原文連接都在文...
閱讀 2382·2021-11-24 10:31
閱讀 3437·2021-11-23 09:51
閱讀 2247·2021-11-15 18:11
閱讀 2397·2021-09-02 15:15
閱讀 2460·2019-08-29 17:02
閱讀 2293·2019-08-29 15:04
閱讀 840·2019-08-29 12:27
閱讀 2864·2019-08-28 18:15