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; t

// 一维数组,31个元素 [-1000,-1000,-1000,.......]

double h[] = trellis[t - 1];

//i shape(31 ,1) 31行,1列 [ [-1000][-10000][-1000] ]

//i = np.expand_dims(trellis[t - 1], 1)

//

// double expand_dims[][] = new double[trans.length][trans[0].length]; //??

// for(int j = 0;j

// expand_dims[j] = h; //todo

// }

//zyy begin

double expand_h[][]=new double[trans.length][trans[0].length];

for(int i=0;i

for(int j=0;j

expand_h[i][j]=h[i];

}

}

double expand_dims[][] = new double[trans.length][trans[0].length]; //??

for(int j = 0;j

expand_dims[j] =expand_h[j] ; //todo

}

//zyy_end

double v[][] = new double[trans.length][trans[0].length];

for(int i = 0; i < v.length; i++ ) {

for(int j = 0; j< v[0].length ;j++) {

v[i][j] = expand_dims[i][j] + trans[i][j];

}

}

//取每列最大的值 得到score.length个每列最大值,一维数组

double max_v[] = new double[trans[0].length];

int max_v_linepoint[] = new int[trans[0].length];

for (int j = 0; j < v[0].length; j++) {

double max_column = v[0][j];

int line_point = 0;

for (int i = 0; i < v.length; i++) {

if(v[i][j] > max_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

// score_double[i]=score.get(i);

for(int j=0;j

score_double[i][j]=score.get(i).get(j);

}

}

double[][] trans_double=new double[trans.size()][trans.get(0).size()];

for(int i=0;i

// score_double[i]=score.get(i);

for(int j=0;j

trans_double[i][j]=trans.get(i).get(j);

}

}

int[] result=viterbi_decode(score_double,trans_double);

System.out.println("===========****===============");

System.out.println(result.toString());

}

}

viterbi java_viterbi 维特比解码过程,状态转移矩阵相关推荐

  1. HTK的解码过程的理解又遇到瓶颈了

    再次参考HTK book的12章.13章.重新捋一遍识别网络的构建过程和维特比解码过程. 构建识别网络是重中之重,而它的基础是lattice,描述lattice的是Standard Lattice F ...

  2. 人工智能里的数学修炼 | 隐马尔可夫模型 : 维特比(Viterbi)算法解码隐藏状态序列

    人工智能里的数学修炼 | 概率图模型 : 隐马尔可夫模型 人工智能里的数学修炼 | 隐马尔可夫模型:前向后向算法 人工智能里的数学修炼 | 隐马尔可夫模型 : 维特比(Viterbi)算法解码隐藏状态 ...

  3. 语音识别维特比解码_一种基于维特比算法的花洒语音识别系统及方法与流程

    本发明涉及语音识别技术领域,具体涉及一种基于维特比算法的花洒语音识别系统及方法. 背景技术: 随着生活水平的提高和住房条件的改善,很多家庭都安装了沐浴设施,花洒是其中最常见的淋浴装置.目前花洒产品多为 ...

  4. HMM条件下的 前向算法 和 维特比解码

    一.隐马尔科夫HMM如果: 有且仅仅有3种天气:0晴天.1阴天.2雨天 各种天气间的隔天转化概率mp: mp[3][3] 晴天 阴天 雨天 晴天 0.33333 0.33333 0.33333 阴天 ...

  5. 语音识别维特比解码_3-GMM-HMMs语音识别系统-解码篇

    本文主要描述基于GMM-HMMs传统语音识别的解码过程. Outline: Viterbi decoding Cross-word decoding Beam search 1.Viterbi dec ...

  6. 单个神经元不可靠!这项新研究推翻以往认知,感知的最大限制在于解码过程...

    来源:凹非寺 "单个神经元不可靠!" 一项关于神经元的研究,让众人看嗨了. 这项研究通过在小鼠身上做实验,先展示了神经元"不靠谱"的一面: 单个神经元两次对相同 ...

  7. e的矩阵次方_利用状态转移矩阵和VBA求游戏中各种事件达成次数的期望

    在工作中计算经济数值的时候,经常会遇到需要计算各种事件完成期望的工作(比如计算集齐一套特定的卡牌搭配需要抽多少次--).本文就介绍一种比较快捷的计算方法. 一般来说,计算期望有以下几种方法: 依据期望 ...

  8. 脑结构-功能耦合解码大脑状态和个体指纹

    功能活动的大脑信号在解码大脑状态(意思是区分不同的任务)和指纹(在一个大群体中识别个体)两方面都显示出了良好的结果.重要的是,这些脑信号并不能解释大脑功能发生的基础脑解剖学.最近,基于图信号处理(GS ...

  9. matlab 求状态转移矩阵,状态转移矩阵计算解读.ppt

    状态转移矩阵计算解读 A的特征值互异(3/4)--例3-7 例3-7 试求如下系统矩阵的矩阵指数函数 解 由于矩阵A的3个特征值互异,并分别为-1,-2和-3,因此解方程组(3-52)可得 A的特征值 ...

最新文章

  1. 量子计算机就要来了,它真的能改变世界吗?
  2. 工作笔记-2019.7.8
  3. 如何学好Java?你应该躲开这几个坑
  4. 零基础学Java编程一定要上Java培训机构吗
  5. redis底层数据结构简述
  6. yolov3算法优点缺点_优点缺点
  7. javascript --- Object.create的阅读
  8. 【转】unity地形插件T4M使用帮助
  9. matlab for循环不覆盖,Matlab for 多个变量循环能不能这样啊 ,求教高手!!!!...
  10. 【Vue.js源码解析 二】-- 虚拟 DOM
  11. 冷热分离和直接使用大数据库_智能冷热分离的思考-内存数据库
  12. 一步一坑学android之禁用Appt2(andriod studio3.0)
  13. 机器学习-极大似然估计
  14. 最简单企业证书部署应用!In-House改进版!免HTTPS!
  15. maven内置属性详细说明
  16. Android系统 ——高通平台刷机流程(qfil)
  17. FTA故障树分析法-DFMEA的另外一张脸
  18. 【50 笔试真题 C++】堆棋子
  19. OA系统权限分派实施方案
  20. 中国芯绝配:普华推全新龙芯3A3000操作系统

热门文章

  1. win10系统 软件图标 移动到开始磁贴上方法
  2. 脑电图(EEG)基础知识
  3. C++11 - std::string - stod/stof/stoi/stol/stold/stoll/stoul/stoull
  4. 第一节:Android蓝牙系统
  5. 在不同操作系统上调试Web报表的网络连接方式
  6. 2014年年终总结和2015年规划
  7. 翻译他们对沉溺于计算机游戏,句子翻译Ⅰ-答案
  8. 用TensorFlow做一个玩微信跳一跳的AI
  9. Java进阶学习第十六天(Struts框架:配置、数据处理、自动封装、日期类型转换、文件上传)
  10. WooCommerce适合企业电子商务吗?