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

本文详细介绍了Viterbi算法的过程,包括状态转移和发射概率。通过逐次计算每个序列节点的状态概率,找到最大概率路径。利用状态转移矩阵辅助计算,适用于寻找最佳状态转移路径。文中还提供了Java代码实现,用于演示Viterbi解码。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值