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

1应用实例:推断天气状态


古代中国人通过天气状态的变化规律,探索出很多预测天气的方法,这种基于经验的预测方式,也是一种基于历史数据的概率模型。虽然现实中的天气状态包括晴天、阴雨、多云、小雨、中雨、雷阵雨等,但是我们想象地球上有这样一个地方,这个地方有着非常理想化的特性:天气要么晴朗要么阴雨。面对晴朗或者阴雨这个地方的居民身体会有有三种直观感觉:干爽、微凉、寒冷。
第一天当地居民感觉很干爽;第二天他们感觉有点微凉;第三天他们感觉有些寒冷。那么,根据这三天居民对天气的直观感受,推断这三天的天气情况。
也许通过上述信息还不足以进行定量的分析,则补充数据:
(1)已知每天天气为晴朗的概率为0.6,为阴雨的概率为0.4。
(2)天气之间也有着相互变化的可能。例如,晴朗天气持续的概率为0.7;晴朗天气到阴雨天气的概率为0.3;阴雨天气到晴朗天气的概率是0.4;阴雨天气持续的概率为0.6。
(3)此外,在晴朗的天气时,当地居民直观感觉干爽的概率为0.5,感觉微凉的概率为0.4,感觉寒冷的概率为0.1;在阴雨天气时,当地居民直观感觉干爽的概率为0.1,感觉微凉的概率为0.3,感觉寒冷的概率为0.6。

2.维特比算法思想

维特比算法的思想是假设某一个数据的当前状态是依赖于它的前一个状态,它们在多个状态之间可以相互影响,而维特比算法正是从这些状态中推断出最大可能概率的状态序列(也可称作最短路径)。因此,维特比算法解决问题的理论基础可归纳为如下:
在通过概率计算出最大可能的路径Pn中,它经过n个点,则其中的P,(0<i<n)也是一个最大可能的概率路径,P1是基于P11的概率进行计算的最大可能概率。

3.计算天气状态


通过对维特比思想的介绍,可以发现示例中的问题是维特比算法较为擅长解决的问题。根据维特比的理论,天气的后一天状态会依赖于前一天的天气状态(晴朗、阴雨)和当前可观察的状态(干爽、微凉、寒冷),因此只需要根据当地居民第一天干爽状态推断到第三天的寒冷状态,就可以知道这三天的天气状态情况,由已知P(晴朗)=0.6,P(阴雨)=0.4因此,计算过程如下。
(1)计算第一天最可能的天气状态。
第一天当地居民感受到干爽,因此:

P(第一天晴朗)=P(干爽|晴朗)xP(晴朗)=0.5×0.6=0.3
P(第一天阴雨)=P(干爽|阴雨)xP(阴雨)=0.1×0.4=0.04

因此第一天晴朗的概率0.3,音乐的概率0.04,显然第一天天气的最大可能状态是晴朗。
(2)计算第二天最可能的天气状态。

第二天当地居民感受到微凉,因此:
P(第一天阴雨,第二天阴雨)=P(阴雨|第一天)xP(阴雨->阴雨)xP(冷|阴雨)=0.04×0.6×0.3=0.0072
P(第一天阴雨,第二天晴朗)=P(阴雨|第一天)xP(阴雨->晴朗)xP(冷|晴朗)=0.04×0.4×0.4=0.0064
P(第一天晴朗,第二天晴朗)=P(晴朗|第一天)xP(晴朗->晴朗)xP(冷|晴朗)=0.3×0.7×0.4=0.084
P(第一天晴朗,第二天阴雨)=P(晴朗|第一天)xP(晴朗->阴雨)xP(冷|阴雨)=0.3×0.3×0.3=0.027

显然,第二天最可能的状态依然是晴朗。
(3)计算第三天最可能的天气状态。

P(第二天阴雨,第三天阴雨)=P(阴雨|第二天)xP(阴雨->阴雨)xP(头晕|阴雨)=0.027×0.6×0.6=0.00972
P(第二天阴雨,第三天晴朗)=P(晴朗|第二天)xP(阴雨->晴朗)xP(头晕|晴朗)=0.027×0.4×0.1=0.00108
P(第二天晴朗,第三天晴朗)=P(阴雨|第二天)xP(晴朗->晴朗)xP(头晕|晴朗)=0.084×0.7×0.1=0.00588
P(第二天晴朗,第三天阴雨)=P(晴朗|第二天)xP(晴朗->阴雨)xP(头晕|阴雨)=0.084×0.3×0.6=0.01512

由上可以看出第三天的状态最可能是阴雨。
综合上面三次对天气的推断,三天的天气状态最可能是:晴朗、晴朗、阴雨。在计算的过程中也不难发现,越是计算到后面,计算得到的概率值越小。这是因为,本次的计算结果是依赖于上一次的概率,而概率一般都是小于1,因此计算结果越来越小,也意味者越是到后面,计算的准确度也越来越低。
维特比算法与隐马尔科夫模型也常常组合在一起用于计算一些概率性的问题,如进行中文分词、自然语言处理中的命名实体识别、词性标注、天气预测等,维特比算法则作为隐马尔科夫模型的解码问题的算法。
维特比算法实质也是一种基于概率论的路径选择。不同于前面所讲解的路径算法,它通过概率的方式选择合适的路径,而这些路径很可能就是一些序列的状态。