viterbi算法
简介
viterbi算法其实就是多步骤每步多选择模型的最优选择问题,其在每一步的所有选择都保存了前续所有步骤到当前步骤当前选择的最小总代价(或者最大价值)以及当前代价的情况下前继步骤的选择。依次计算完所有步骤后,通过回溯的方法找到最优选择路径。符合这个模型的都可以用viterbi算法解决。
最优路径理解
在理解viterbi算法之前,我们先来跟随步骤计算一下下面这幅图从左到右的最大路径
下面我们计算的步骤,就是viterbi算法的整个过程:
1.计算从s到所有的x的路径长度,因为s到每一个x只有一条路径,因此不需要做选择
2.计算每个x到每个y的路径,并分别选出每个x到每一个y的最大路径,对于图中,就是x1->y2和x2->y1
3.重复上述步骤,计算每个y到e的最大路径,如图,即y2->e
那么,最长路径即为25,并且该条路径为s->x1->y2->e,至此,viterbi算法结束。
例子说明
1、 题目背景
从前有个村儿,村里的人身体情况只有两种可能:健康或者发烧
假设这个村儿的人没有体温计或者百度这种神奇的东西,它唯一判断身体情况的途径是到村头小诊所询问
月儿通过询问村民的感觉,判断他的病情,再假设村民只会回答正常、头晕或冷
有一天村里的澳巴卢就去月儿那询问了
第一天他告诉月儿他感觉正常
第二天他告诉月儿他有点冷
第三天他告诉月儿感觉有点头晕
那么问题来了,月儿如何根据阿鲁的描述情况,推断出这三天中阿鲁的一个身体状态呢?
为此月儿上百度搜google,一番狂搜,发现维特比算法正好能解决这个问题,月儿乐了
2、 已知情况
隐含的身体状况={健康,发烧}
可观察的感觉状态={正常、冷、头晕}
月儿预判的阿鲁的身体状态的概率分布={健康:0.6,发烧:0.4}
月儿认为的阿鲁的身体健康的转换概率分布={
健康->健康:0.7
健康->发烧:0.3
发烧->健康:0.4
发烧->发烧:0.6
}
月儿认为的在相应的健康状况条件下,阿鲁的感觉的概率分布={
健康,正常:0.5,冷:0.4,头晕:0.1;
发烧,正常:0.1,冷:0.3,头晕:0.6
}
阿鲁连续三天的身体感觉依次是:正常、冷、头晕。
3、 已知上述,求:阿鲁这三天的身体健康状态变换的过程是怎么样的?
4、 过程:
根据Viterbi理论,后一天的状态会依赖前一天的状态和当前的可能观察的状态。那么只要根据第一天的正常状态依次推算找出到达第三天头晕状态的最大概率,就可以知道这三天的身体变换情况。
1.初始情况:
P(健康) = 0.6,P(发烧)=0.4。
2.求第一天的身体情况:
计算在阿驴感觉正常的情况下最可能的身体状态。
P(今天健康) = P(正常|健康)*P(健康|初始情况) = 0.5 * 0.6 = 0.3
P(今天发烧) = P(正常|发烧)*P(发烧|初始情况) = 0.1 * 0.4 = 0.04
那么就可以认为第一天最可能的身体状态是:健康。
3.求第二天的身体状况:
计算在阿驴感觉冷的情况下最可能的身体状态。
那么第二天有四种情况,由于第一天的发烧或者健康转换到第二天的发烧或者健康。
P(前一天发烧,今天发烧) = P(前一天发烧)*P(发烧->发烧)*P(冷|发烧) = 0.04 * 0.6 * 0.3 = 0.0072
P(前一天发烧,今天健康) = P(前一天发烧)*P(发烧->健康)*P(冷|健康) = 0.04 * 0.4 * 0.4 = 0.0064
P(前一天健康,今天健康) = P(前一天健康)*P(健康->健康)*P(冷|健康) = 0.3 * 0.7 * 0.4 = 0.084
P(前一天健康,今天发烧) = P(前一天健康)*P(健康->发烧)*P(冷|发烧) = 0.3 * 0.3 *.03 = 0.027
那么可以认为,第二天最可能的状态是:健康。
4.求第三天的身体状态:
计算在阿驴感觉头晕的情况下最可能的身体状态。
P(前一天发烧,今天发烧) = P(前一天发烧)*P(发烧->发烧)*P(头晕|发烧) = 0.027 * 0.6 * 0.6 = 0.00972
P(前一天发烧,今天健康) = P(前一天发烧)*P(发烧->健康)*P(头晕|健康) = 0.027 * 0.4 * 0.1 = 0.00108
P(前一天健康,今天健康) = P(前一天健康)*P(健康->健康)*P(头晕|健康) = 0.084 * 0.7 * 0.1 = 0.00588
P(前一天健康,今天发烧) = P(前一天健康)*P(健康->发烧)*P(头晕|发烧) = 0.084 * 0.3 *0.6 = 0.01512
那么可以认为:第三天最可能的状态是发烧。
5.结论
根据如上计算。这样月儿断定,阿驴这三天身体变化的序列是:健康->健康->发烧。
这个算法大概就是通过已知的可以观察到的序列,和一些已知的状态转换之间的概率情况,通过综合状态之间的转移概率和前一个状态的情况计算出概率最大的状态转换路径,从而推断出隐含状态的序列的情况。