资讯专栏INFORMATION COLUMN

viterbi 维特比解码过程,状态转移矩阵

tuantuan / 962人阅读

摘要:状态转移,发射概率逐次计算每个序列节点的所有状态下的概率值,最大概率值对应的。应用状态转移求解最佳转移路径。状态转移矩阵的作用在于在每个状态转移概率计算时,和固有的状态转移矩阵进行加和,再计算。

</>复制代码

  1. viterbi过程
  2. 1.hmm类似。 状态转移,发射概率
  3. 2.逐次计算每个序列节点的所有状态下的概率值,最大概率值对应的index
  4. 3.概率值的计算,上一个节点的概率值*转移概率+当前概率值。
  5. 4.最后取出最大的一个值对应的indexes
  6. 难点: 理解viterbi的核心点,在于每个时间步都保留每一个可视状态,每一个可视状态保留上一个时间步的最大隐状态转移,
  7. 每一个时间步t记录上一个最大概率转移过来的时间步t-1的信息,包括index/概率值累积。
  8. 迭代完时间步,根据最后一个最大累积概率值,逐个往前找即可。 根据index对应的状态逐个往前找。
  9. 应用: 状态转移求解最佳转移路径。 只要连续时间步,每个时间步有状态分布,前后时间步之间有状态转移,就可以使用viterbi进行最佳状态转移计算求解。
  10. 状态转移矩阵的作用在于 在每个状态转移概率计算时,和固有的状态转移矩阵进行加和,再计算。相当于额外的概率添加。

</>复制代码

  1. import numpy as np
  2. def viterbi_decode(score, transition_params):
  3. """
  4. 保留所有可视状态下,对seqlen中的每一步的所有可视状态情况下的中间状态求解概率最大值,如此
  5. :param score:
  6. :param transition_params:
  7. :return:
  8. """
  9. # score [seqlen,taglen] transition_params [taglen,taglen]
  10. trellis=np.zeros_like(score)
  11. trellis[0]=score[0]
  12. backpointers=np.zeros_like(score,dtype=np.int32)
  13. for t in range(1,len(score)):
  14. matrix_node=np.expand_dims(trellis[t-1],axis=1)+transition_params #axis=0 代表发射概率初始状态
  15. trellis[t]=score[t]+np.max(matrix_node,axis=0)
  16. backpointers[t]=np.argmax(matrix_node,axis=0)
  17. viterbi=[np.argmax(trellis[-1],axis=0)]
  18. for backpointer in reversed(backpointers[1:]):
  19. viterbi.append(backpointer[viterbi[-1]])
  20. viterbi_score = np.max(trellis[-1])
  21. viterbi.reverse()
  22. print(trellis)
  23. return viterbi,viterbi_score
  24. def calculate():
  25. score = np.array([[1, 2, 3],
  26. [2, 1, 3],
  27. [1, 3, 2],
  28. [3, 2,1]]) # (batch_size, time_step, num_tabs)
  29. transition = np.array([ [2, 1, 3], [1, 3, 2], [3, 2, 1] ] )# (num_tabs, num_tabs)
  30. lengths = [len(score[0])] # (batch_size, time_step) # numpy print("[numpy]")
  31. # np_op = viterbi_decode( score=np.array(score[0]), transition_params=np.array(transition))
  32. # print(np_op[0])
  33. # print(np_op[1])
  34. print("=============") # tensorflow
  35. # score_t = tf.constant(score, dtype=tf.int64)
  36. # transition_t = transition, dtype=tf.int64
  37. tf_op = viterbi_decode( score, transition)
  38. print("--------------------")
  39. print(tf_op)
  40. if __name__=="__main__":
  41. calculate()

</>复制代码

  1. // java 版本
  2. import java.lang.reflect.Array;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public class viterbi {
  6. public static int[] viterbi_decode(double[][]score,double[][]trans ) {
  7. //score(16,31) trans(31,31)
  8. int path[] = new int[score.length];
  9. double trellis[][] = new double[score.length][score[0].length];
  10. int backpointers[][] = new int [score.length][score[0].length];
  11. trellis[0] = score[0];
  12. for(int t = 1; t max_column) {
  13. max_column = v[i][j];
  14. line_point = i;
  15. }
  16. }
  17. max_v[j] = max_column;
  18. max_v_linepoint[j] = line_point;
  19. }
  20. for(int i = 0 ;i < score[0].length; i++ ) {
  21. trellis[t][i] = score[t][i] + max_v[i];
  22. backpointers[t][i] = max_v_linepoint[i];
  23. }
  24. }
  25. int viterbi[] = new int[score.length];
  26. // List viterbi = new ArrayList<>();
  27. double max_trellis = trellis[score.length-1][0];
  28. for(int j = 0; j< trellis[score.length-1].length ;j++) {
  29. if(trellis[score.length-1][j] > max_trellis) {
  30. max_trellis = trellis[score.length-1][j];
  31. // viterbi.add(j);
  32. viterbi[0] = j;
  33. }
  34. }
  35. for(int i=1;i< 1+(backpointers.length)/2;i++){
  36. int temp[] = backpointers[i];
  37. backpointers[i] = backpointers[backpointers.length-i];
  38. backpointers[backpointers.length-i]=temp;
  39. }
  40. for(int i = 1; i < backpointers.length; i++ ) {
  41. // viterbi.add( backpointers[i][viterbi.get(viterbi.size() - 1)]);
  42. viterbi[i] = backpointers[i][viterbi[i-1]];
  43. }
  44. for(int i = 0;i < (viterbi.length)/2; i++){ //把数组的值赋给一个临时变量
  45. int temp = viterbi[i];
  46. viterbi[i] = viterbi[viterbi.length-i-1];
  47. viterbi[viterbi.length-i-1] = temp;
  48. }
  49. return viterbi;
  50. }
  51. public static void main(String[] args){
  52. List> score=new ArrayList<>();
  53. ArrayList row1=new ArrayList<>();
  54. row1.add(1);
  55. row1.add(2);
  56. row1.add(3);
  57. ArrayList row2=new ArrayList<>();
  58. row2.add(2);
  59. row2.add(1);
  60. row2.add(3);
  61. ArrayList row3=new ArrayList<>();
  62. row3.add(1);
  63. row3.add(3);
  64. row3.add(2);
  65. ArrayList row4=new ArrayList<>();
  66. row4.add(3);
  67. row4.add(2);
  68. row4.add(1);
  69. score.add(row1);
  70. score.add(row2);
  71. score.add(row3);
  72. score.add(row4);
  73. List> trans=new ArrayList<>();
  74. ArrayList row11=new ArrayList<>();
  75. row11.add(2);
  76. row11.add(1);
  77. row11.add(3);
  78. ArrayList row12=new ArrayList<>();
  79. row12.add(1);
  80. row12.add(3);
  81. row12.add(2);
  82. ArrayList row13=new ArrayList<>();
  83. row13.add(3);
  84. row13.add(2);
  85. row13.add(1);
  86. trans.add(row11);
  87. trans.add(row12);
  88. trans.add(row13);
  89. // double[][] score_double=(double[][]) score.toArray();
  90. // double[][] trans_double=(double[][]) trans.toArray();
  91. System.out.println(score);
  92. System.out.println(trans);
  93. double[][] score_double=new double[score.size()][score.get(0).size()];
  94. for(int i=0;i

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43429.html

相关文章

  • vertibi python 实现

    摘要:题目阐释算法实现。用实现的和表现层的转移动态规划问题,归结到相邻两个之间存在转移概率,转移概率。难点三层循环,为了保留,计算每个的的概率,所以要嵌套在之外。 题目阐释: viterbi算法实现。 用python实现viterbi的hidden state 和 表现层的转移 动态规划问题,归结到 相邻两个step之间存在 state转移概率,state2emibission转移概...

    zhangyucha0 评论0 收藏0
  • MCMC和Gibbs Sampling算法

    摘要:算法中的马氏链转移以上采样过程中,如图所示,马氏链的转移只是轮换的沿着坐标轴轴和轴做转移,于是得到样本马氏链收敛后,最终得到的样本就是的样本,而收敛之前的阶段称为。 作者:chen_h微信号 & QQ:862251340微信公众号:coderpai简书地址:https://www.jianshu.com/p/278... 本文是整理网上的几篇博客和论文所得出来的,所有的原文连接都在文...

    Bamboy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<