fbpx
维基百科

维特比算法

维特比算法(英語:Viterbi algorithm)是一种动态规划算法。它用于寻找最有可能产生观测事件序列维特比路径——隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中。

术语“维特比路径”和“维特比算法”也被用于寻找观察结果最有可能解释相关的动态规划算法。例如在统计句法分析中动态规划算法可以被用于发现最可能的上下文无关的派生(解析)的字符串,有时被称为“维特比分析”。

维特比算法由安德鲁·维特比Andrew Viterbi)于1967年提出,用于在数字通信链路中解卷积以消除噪音。[1] 此算法被广泛应用于CDMAGSM数字蜂窝网络、拨号调制解调器、卫星、深空通信和802.11无线网络中解卷积码。现今也被常常用于语音识别、关键字识别、计算语言学生物信息学中。例如在语音(语音识别)中,声音信号做为观察到的事件序列,而文本字符串,被看作是隐含的产生声音信号的原因,因此可对声音信号应用维特比算法寻找最有可能的文本字符串。

算法 编辑

假设给定隐式马尔可夫模型(HMM)状态空间  ,共有k个状态,初始状态   的概率为   ,从状态   到状态   的转移概率为  。 令观察到的输出为  。 产生观察结果的最有可能的状态序列   由递推关系给出:[2]

 

此处   是前   个最终状态为   的观测结果最有可能对应的状态序列的概率。 通过保存向后指针记住在第二个等式中用到的状态   可以获得维特比路径。声明一个函数   ,它返回若  时计算   用到的   值 或若  时的  . 这样:

 

这里我们使用了arg max英语arg max的标准定义 算法复杂度为  

例子 编辑

想象一个乡村诊所。村民有着非常理想化的特性,要么健康要么发烧。他们只有问诊所的医生的才能知道是否发烧。 聪明的医生通过询问病人的感觉诊断他们是否发烧。村民只回答他们感觉正常、头晕或冷。

假设一个病人每天来到诊所并告诉医生他的感觉。医生相信病人的健康状况如同一个离散马尔可夫链。病人的状态有两种“健康”和“发烧”,但医生不能直接观察到,这意味着状态对他是“隐含”的。每天病人会告诉医生自己有以下几种由他的健康状态决定的感觉的一种:正常、冷或头晕。这些是观察结果。 整个系统为一个隐马尔可夫模型(HMM)。

医生知道村民的总体健康状况,还知道发烧和没发烧的病人通常会抱怨什么症状。 换句话说,医生知道隐马尔可夫模型的参数。 这可以用Python语言表示如下:

states = ('Healthy', 'Fever') observations = ('normal', 'cold', 'dizzy') start_probability = {'Healthy': 0.6, 'Fever': 0.4} transition_probability = { 'Healthy' : {'Healthy': 0.7, 'Fever': 0.3}, 'Fever' : {'Healthy': 0.4, 'Fever': 0.6}, } emission_probability = { 'Healthy' : {'normal': 0.5, 'cold': 0.4, 'dizzy': 0.1}, 'Fever' : {'normal': 0.1, 'cold': 0.3, 'dizzy': 0.6}, } 

在这段代码中, 起始概率start_probability 表示病人第一次到访时医生认为其所处的HMM状态,他唯一知道的是病人倾向于是健康的。这里用到的特定概率分布不是均衡的,如转移概率大约是{'Healthy': 0.57, 'Fever': 0.43}。 转移概率transition_probability表示潜在的马尔可夫链中健康状态的变化。在这个例子中,当天健康的病人仅有30%的机会第二天会发烧。放射概率emission_probability表示每天病人感觉的可能性。假如他是健康的,50%会感觉正常。如果他发烧了,有60%的可能感觉到头晕。

 
Graphical representation of the given HMM

病人连续三天看医生,医生發现第一天他感觉正常,第二天感觉冷,第三天感觉头晕。 于是医生产生了一个问题:怎样的健康状态序列最能够解释这些观察结果。维特比算法解答了这个问题。

def viterbi(obs, states, start_p, trans_p, emit_p):  V = [{}]  path = {}   # Initialize  for st in states:  V[0][st] = start_p[st] * emit_p[st][obs[0]]  path[st] = [st]   # Run Viterbi when t > 0  for t in range(1,len(obs)):  V.append({})  newpath = {}   for curr_st in states:  paths_to_curr_st = []  for prev_st in states:  paths_to_curr_st.append((V[t-1][prev_st] * trans_p[prev_st][curr_st] * emit_p[curr_st][obs[t]], prev_st))  curr_prob, prev_state = max(paths_to_curr_st)  V[t][curr_st] = curr_prob  newpath[curr_st] = path[prev_state] + [curr_st]   # No need to keep the old paths  path = newpath   for line in dptable(V):  print(line)  prob, end_state = max([(V[-1][st], st) for st in states])  return prob, path[end_state]  def dptable(V):  # Print a table of steps from dictionary  yield ' ' * 4 + ' '.join(states)  for t in range(len(V)):  yield '{} '.format(t) + ' '.join(['{:.4f}'.format(V[t][state]) for state in V[0]]) 

函数viterbi 具有以下参数: obs 为观察结果序列, 例如 ['normal', 'cold', 'dizzy']states 为一组隐含状态; start_p 为起始状态概率; trans_p 为转移概率; 而 emit_p 为放射概率。 为了简化代码,我们假设观察序列 obs 非空且 trans_p[i][j]emit_p[i][j] 对所有状态 i,j 有定义。

在运行的例子中正向/维特比算法使用如下:

def example(): return viterbi(observations, states, start_probability, transition_probability, emission_probability) print(example()) 

维特比算法揭示了观察结果 ['normal', 'cold', 'dizzy'] 最有可能由状态序列 ['Healthy', 'Healthy', 'Fever']产生。 换句话说,对于观察到的活动, 病人第一天感到正常,第二天感到冷时都是健康的,而第三天发烧了。

维特比算法的计算过程可以直观地由格图表示。 维特比路径本质上是穿过格式结构的最长路径。 诊所例子的格式结构如下, 黑色加粗的是维特比路径:

 
Animation of the trellis diagram for the Viterbi algorithm. After Day 3, the most likely path is ['Healthy', 'Healthy', 'Fever']

在实现维特比算法时需注意许多编程语言使用浮点数计算,当 p 很小时可能会导致结果算术下溢。 避免这一问题的常用技巧是在整个计算过程中使用对数概率,在对数系统中也使用了同样的技巧。 当算法结束时,可以通过适当的幂运算获得精确结果。

伪代码 编辑

首先是一些问题必要的设置。 设观察值空间为  状态空间 、 观察值序列为  ,   转移矩阵,其中   为从状态   转移到  转移概率   放射矩阵(emission matrix),其中   为在状态   观察到   的概率、 大小为   的初始概率数组     的概率。 我们称路径   为生成观察值   的状态序列。

在这个动态规划问题中, 我们构造了两个大小为   的二维表    的每个元素,   ,保存生成   时最有可能的路径    的概率。   的每个元素,  ,保存最有可能路径   ,   

我们按   增序填充两个表  

 ,
 
输入
  • 观察空间  
  • 状态  
  • 观察序列   若在  时间观察值为  ,则  ,
  • 大小为   的转移矩阵    为从状态    的转移概率,
  • 大小为   的放射矩阵    为状态   观察到   的概率,
  • 大小为   的初始概率数组     的概率,
输出
  • 最有可能的隐含状态序列  
 function VITERBI( O, S, π, Y, A, B ) : X for each state si do T1[i,1] ← πi·Biy1 T2[i,1] ← 0 end for for i2,3,...,T do for each state sj do     end for end for   xT ← szT for iT,T-1,...,2 do zi-1T2[zi,i] xi-1szi-1 end for return X end function 

使用动态规划的算法 编辑

注释 编辑

  1. ^ 29 Apr 2005, G. David Forney Jr: The Viterbi Algorithm: A Personal History. [2012-11-23]. (原始内容于2016-06-02). 
  2. ^ Xing E, slide 11

参考资料 编辑

  • Viterbi AJ. Error bounds for convolutional codes and an asymptotically optimum decoding algorithm. IEEE Transactions on Information Theory. April 1967, 13 (2): 260–269 [2012-11-23]. doi:10.1109/TIT.1967.1054010. (原始内容于2020-07-29).  (note: the Viterbi decoding algorithm is described in section IV.) Subscription required.

维特比算法, 英語, viterbi, algorithm, 是一种动态规划算法, 它用于寻找最有可能产生观测事件序列的维特比路径, 隐含状态序列, 特别是在马尔可夫信息源上下文和隐马尔可夫模型中, 术语, 维特比路径, 也被用于寻找观察结果最有可能解释相关的动态规划算法, 例如在统计句法分析中动态规划算法可以被用于发现最可能的上下文无关的派生, 解析, 的字符串, 有时被称为, 维特比分析, 由安德鲁, 维特比, andrew, viterbi, 于1967年提出, 用于在数字通信链路中解卷积以消除噪音, 此算法. 维特比算法 英語 Viterbi algorithm 是一种动态规划算法 它用于寻找最有可能产生观测事件序列的维特比路径 隐含状态序列 特别是在马尔可夫信息源上下文和隐马尔可夫模型中 术语 维特比路径 和 维特比算法 也被用于寻找观察结果最有可能解释相关的动态规划算法 例如在统计句法分析中动态规划算法可以被用于发现最可能的上下文无关的派生 解析 的字符串 有时被称为 维特比分析 维特比算法由安德鲁 维特比 Andrew Viterbi 于1967年提出 用于在数字通信链路中解卷积以消除噪音 1 此算法被广泛应用于CDMA和GSM数字蜂窝网络 拨号调制解调器 卫星 深空通信和802 11无线网络中解卷积码 现今也被常常用于语音识别 关键字识别 计算语言学和生物信息学中 例如在语音 语音识别 中 声音信号做为观察到的事件序列 而文本字符串 被看作是隐含的产生声音信号的原因 因此可对声音信号应用维特比算法寻找最有可能的文本字符串 目录 1 算法 2 例子 3 伪代码 4 使用动态规划的算法 5 注释 6 参考资料算法 编辑假设给定隐式马尔可夫模型 HMM 状态空间 S displaystyle S nbsp 共有k个状态 初始状态 i displaystyle i nbsp 的概率为 p i displaystyle pi i nbsp 从状态 i displaystyle i nbsp 到状态 j displaystyle j nbsp 的转移概率为 a i j displaystyle a i j nbsp 令观察到的输出为 y 1 y T displaystyle y 1 dots y T nbsp 产生观察结果的最有可能的状态序列 x 1 x T displaystyle x 1 dots x T nbsp 由递推关系给出 2 V 1 k P y 1 k p k V t k max x S P y t k a x k V t 1 x displaystyle begin array rcl V 1 k amp amp mathrm P big y 1 k big cdot pi k V t k amp amp max x in S left mathrm P big y t k big cdot a x k cdot V t 1 x right end array nbsp 此处 V t k displaystyle V t k nbsp 是前 t displaystyle t nbsp 个最终状态为 k displaystyle k nbsp 的观测结果最有可能对应的状态序列的概率 通过保存向后指针记住在第二个等式中用到的状态 x displaystyle x nbsp 可以获得维特比路径 声明一个函数 P t r k t displaystyle mathrm Ptr k t nbsp 它返回若 t gt 1 displaystyle t gt 1 nbsp 时计算 V t k displaystyle V t k nbsp 用到的 x displaystyle x nbsp 值 或若 t 1 displaystyle t 1 nbsp 时的k displaystyle k nbsp 这样 x T arg max x S V T x x t 1 P t r x t t displaystyle begin array rcl x T amp amp arg max x in S V T x x t 1 amp amp mathrm Ptr x t t end array nbsp 这里我们使用了arg max 英语 arg max 的标准定义 算法复杂度为 O T S 2 displaystyle O T times left S right 2 nbsp 例子 编辑想象一个乡村诊所 村民有着非常理想化的特性 要么健康要么发烧 他们只有问诊所的医生的才能知道是否发烧 聪明的医生通过询问病人的感觉诊断他们是否发烧 村民只回答他们感觉正常 头晕或冷 假设一个病人每天来到诊所并告诉医生他的感觉 医生相信病人的健康状况如同一个离散马尔可夫链 病人的状态有两种 健康 和 发烧 但医生不能直接观察到 这意味着状态对他是 隐含 的 每天病人会告诉医生自己有以下几种由他的健康状态决定的感觉的一种 正常 冷或头晕 这些是观察结果 整个系统为一个隐马尔可夫模型 HMM 医生知道村民的总体健康状况 还知道发烧和没发烧的病人通常会抱怨什么症状 换句话说 医生知道隐马尔可夫模型的参数 这可以用Python语言表示如下 states Healthy Fever observations normal cold dizzy start probability Healthy 0 6 Fever 0 4 transition probability Healthy Healthy 0 7 Fever 0 3 Fever Healthy 0 4 Fever 0 6 emission probability Healthy normal 0 5 cold 0 4 dizzy 0 1 Fever normal 0 1 cold 0 3 dizzy 0 6 在这段代码中 起始概率start probability 表示病人第一次到访时医生认为其所处的HMM状态 他唯一知道的是病人倾向于是健康的 这里用到的特定概率分布不是均衡的 如转移概率大约是 Healthy 0 57 Fever 0 43 转移概率transition probability表示潜在的马尔可夫链中健康状态的变化 在这个例子中 当天健康的病人仅有30 的机会第二天会发烧 放射概率emission probability表示每天病人感觉的可能性 假如他是健康的 50 会感觉正常 如果他发烧了 有60 的可能感觉到头晕 nbsp Graphical representation of the given HMM病人连续三天看医生 医生發现第一天他感觉正常 第二天感觉冷 第三天感觉头晕 于是医生产生了一个问题 怎样的健康状态序列最能够解释这些观察结果 维特比算法解答了这个问题 def viterbi obs states start p trans p emit p V path Initialize for st in states V 0 st start p st emit p st obs 0 path st st Run Viterbi when t gt 0 for t in range 1 len obs V append newpath for curr st in states paths to curr st for prev st in states paths to curr st append V t 1 prev st trans p prev st curr st emit p curr st obs t prev st curr prob prev state max paths to curr st V t curr st curr prob newpath curr st path prev state curr st No need to keep the old paths path newpath for line in dptable V print line prob end state max V 1 st st for st in states return prob path end state def dptable V Print a table of steps from dictionary yield 4 join states for t in range len V yield format t join 4f format V t state for state in V 0 函数viterbi 具有以下参数 obs 为观察结果序列 例如 normal cold dizzy states 为一组隐含状态 start p 为起始状态概率 trans p 为转移概率 而 emit p 为放射概率 为了简化代码 我们假设观察序列 obs 非空且 trans p i j 和 emit p i j 对所有状态 i j 有定义 在运行的例子中正向 维特比算法使用如下 def example return viterbi observations states start probability transition probability emission probability print example 维特比算法揭示了观察结果 normal cold dizzy 最有可能由状态序列 Healthy Healthy Fever 产生 换句话说 对于观察到的活动 病人第一天感到正常 第二天感到冷时都是健康的 而第三天发烧了 维特比算法的计算过程可以直观地由格图表示 维特比路径本质上是穿过格式结构的最长路径 诊所例子的格式结构如下 黑色加粗的是维特比路径 nbsp Animation of the trellis diagram for the Viterbi algorithm After Day 3 the most likely path is Healthy Healthy Fever 在实现维特比算法时需注意许多编程语言使用浮点数计算 当 p 很小时可能会导致结果算术下溢 避免这一问题的常用技巧是在整个计算过程中使用对数概率 在对数系统中也使用了同样的技巧 当算法结束时 可以通过适当的幂运算获得精确结果 伪代码 编辑首先是一些问题必要的设置 设观察值空间为 O o 1 o 2 o N displaystyle O o 1 o 2 dots o N nbsp 状态空间为 S s 1 s 2 s K displaystyle S s 1 s 2 dots s K nbsp 观察值序列为 Y y 1 y 2 y T displaystyle Y y 1 y 2 ldots y T nbsp A displaystyle A nbsp 为 K K displaystyle K times K nbsp 转移矩阵 其中 A i j displaystyle A ij nbsp 为从状态 s i displaystyle s i nbsp 转移到 s j displaystyle s j nbsp 的转移概率 B displaystyle B nbsp 为 K N displaystyle K times N nbsp 放射矩阵 emission matrix 其中 B i j displaystyle B ij nbsp 为在状态 s i displaystyle s i nbsp 观察到 o j displaystyle o j nbsp 的概率 大小为 K displaystyle K nbsp 的初始概率数组 p displaystyle pi nbsp p i displaystyle pi i nbsp 为 x 1 s i displaystyle x 1 s i nbsp 的概率 我们称路径 X x 1 x 2 x T displaystyle X x 1 x 2 ldots x T nbsp 为生成观察值 Y y 1 y 2 y T displaystyle Y y 1 y 2 ldots y T nbsp 的状态序列 在这个动态规划问题中 我们构造了两个大小为 K T displaystyle K times T nbsp 的二维表 T 1 T 2 displaystyle T 1 T 2 nbsp T 1 displaystyle T 1 nbsp 的每个元素 T 1 i j displaystyle T 1 i j nbsp 保存生成 Y y 1 y 2 y j displaystyle Y y 1 y 2 ldots y j nbsp 时最有可能的路径 X x 1 x 2 x j displaystyle hat X hat x 1 hat x 2 ldots hat x j nbsp x j s i displaystyle hat x j s i nbsp 的概率 T 2 displaystyle T 2 nbsp 的每个元素 T 2 i j displaystyle T 2 i j nbsp 保存最有可能路径 X x 1 x 2 x j 1 x j displaystyle hat X hat x 1 hat x 2 ldots hat x j 1 hat x j nbsp j 2 j T displaystyle forall j 2 leq j leq T nbsp 的 x j 1 displaystyle hat x j 1 nbsp 我们按 K j i displaystyle K cdot j i nbsp 增序填充两个表 T 1 i j T 2 i j displaystyle T 1 i j T 2 i j nbsp T 1 i j max k T 1 k j 1 A k i B i y j displaystyle T 1 i j max k T 1 k j 1 cdot A ki cdot B iy j nbsp T 2 i j arg max k T 1 k j 1 A k i B i y j displaystyle T 2 i j arg max k T 1 k j 1 cdot A ki cdot B iy j nbsp 输入观察空间 O o 1 o 2 o N displaystyle O o 1 o 2 dots o N nbsp 状态 S s 1 s 2 s K displaystyle S s 1 s 2 dots s K nbsp 观察序列 Y y 1 y 2 y T displaystyle Y y 1 y 2 ldots y T nbsp 若在t displaystyle t nbsp 时间观察值为 o i displaystyle o i nbsp 则 y t i displaystyle y t i nbsp 大小为 K K displaystyle K cdot K nbsp 的转移矩阵 A displaystyle A nbsp A i j displaystyle A ij nbsp 为从状态 s i displaystyle s i nbsp 到 s j displaystyle s j nbsp 的转移概率 大小为 K N displaystyle K cdot N nbsp 的放射矩阵 B displaystyle B nbsp B i j displaystyle B ij nbsp 为状态 s i displaystyle s i nbsp 观察到 o j displaystyle o j nbsp 的概率 大小为 K displaystyle K nbsp 的初始概率数组 p displaystyle pi nbsp p i displaystyle pi i nbsp 为 x 1 s i displaystyle x 1 s i nbsp 的概率 输出最有可能的隐含状态序列 X x 1 x 2 x T displaystyle X x 1 x 2 ldots x T nbsp function VITERBI O S p Y A B X for each state si do T1 i 1 pi Biy1 T2 i 1 0 end for for i 2 3 T do for each state sj do T 1 j i max k T 1 k i 1 A k j B j y i displaystyle T 1 j i gets max k T 1 k i 1 cdot A kj cdot B jy i nbsp T 2 j i arg max k T 1 k i 1 A k j B j y i displaystyle T 2 j i gets arg max k T 1 k i 1 cdot A kj cdot B jy i nbsp end for end for z T arg max k T 1 k T displaystyle z T gets arg max k T 1 k T nbsp xT szT for i T T 1 2 do zi 1 T2 zi i xi 1 szi 1 end for return X end function使用动态规划的算法 编辑最长公共子序列 Floyd Warshall算法注释 编辑 29 Apr 2005 G David Forney Jr The Viterbi Algorithm A Personal History 2012 11 23 原始内容存档于2016 06 02 Xing E slide 11参考资料 编辑Viterbi AJ Error bounds for convolutional codes and an asymptotically optimum decoding algorithm IEEE Transactions on Information Theory April 1967 13 2 260 269 2012 11 23 doi 10 1109 TIT 1967 1054010 原始内容存档于2020 07 29 note the Viterbi decoding algorithm is described in section IV Subscription required 取自 https zh wikipedia org w index php title 维特比算法 amp oldid 71731547, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。