• 维特比算法通俗案例


    维特比算法通俗案例

    一、总结

    一句话总结:

    月儿通过询问村民的感觉,判断她的病情,再假设村民只会回答正常、头晕或冷。村民三天的感觉分别为:【正常,冷,头晕】。 那么问题来了,月儿如何根据阿驴的描述的情况,【推断出这三天】中阿驴的一个【身体状态】呢?
    因此,从HMM隐马尔科夫模型的角度来说,【健康或者发烧 是身体隐含的状态state】, 而【正常,头晕或者冷是观察序列】,
    因此这三天的观察序列为: 正常, 冷, 头晕, 而每天的身体隐含状况则未知, 这在HMM问题中属于解码问题,可以通过维特比算法,利用【动态规划】算法,来求解出整个HMM链中【每天的隐含状态】。

    1、根据回答推断阿驴这三天身体状态 实例 的一些条件?

    【隐含的身体状态】 = { 健康 , 发烧 }; 【可观察的感觉状态】 = { 正常 , 冷 , 头晕 }
    假定阿驴身体状态的概率分布为 = { 健康:0.6 , 发烧: 0.4 } 这就是【初始状态序列】。
    假定阿驴身体健康状态的【转换概率分布】 = { 健康->健康: 0.7 ,健康->发烧: 0.3 ,发烧->健康:0.4 ,发烧->发烧: 0.6 }
    月儿认为的在相应身体状况条件下,身体感觉这一观测序列的【条件概率分布】 = {正常 冷 头晕;健康: 0.5 0.4 0.1;发烧: 0.1 0.3 0.6;}

    2、根据回答推断阿驴这三天身体状态 实例 具体求解过程?

    第一天: 【P(正常,第一天健康)】 = P(正常|健康) * P(健康|初始情况) = 0.5 * 0.6 = 0.3; 【P(正常, 第一天发烧)】 = P(正常|发烧) * P(发烧|初始情况) = 0.1 * 0.4 = 0.04
    第二天:例如: 当前观测值为冷,假定当前隐含状态为健康,求当前的联合概率分布P(冷,第二天健康) 。首先从 昨天的状态到当前的健康状态 有两种路径(昨天的状态还没确定,而只是先计算出每个状态的概率分布): 昨天健康 ----> 今天健康, 昨天发烧 -----> 今天健康。 【这两个路径分别的概率为 0.3 * 0.7 以及 0.04 * 0.4】, 可以看到 当前如果为健康时,昨天为健康的概率更大,【因此我们选定昨天健康 ----> 今天健康 这条路径】,即记录下当前为健康时,昨天也为健康状态, 然后求得当前的联合概率分布 P(冷,第二天健康) = (0.3 * 0.7 ) * 0.4 = P(第二天健康)
    其实看到这里,你会发现和之前看到的最短路的例子说的一样了:【viterbi 维特比算法到达每一列的时候都会删除不符合最短路径要求的路径】,其实也就是选择概率最大的情况,和最短路那个例子区别就是【一个是路径长度,一个是概率大小】

    二、维特比算法的通俗案例解释(转)

    转自:https://blog.csdn.net/shenxiaoming77/article/details/79228378

    维特比算法本质上就是一个动态规划DP算法,在知乎上看到了关于一个解释维特比算法的解释https://www.zhihu.com/question/20136144, 因此在此特意在转载下,并加入一些个人对于结合实际案例场景下的算法理解说明:

    1.题目背景:

    从前有个村儿,村里的人的身体情况只有两种可能:健康或者发烧。
    假设这个村儿的人没有体温计或者百度这种神奇东西,他唯一判断他身体情况的途径就是到村头我的偶像金正月的小诊所询问。
    月儿通过询问村民的感觉,判断她的病情,再假设村民只会回答正常、头晕或冷。
    有一天村里奥巴驴就去月儿那去询问了。
    第一天她告诉月儿她感觉正常。
    第二天她告诉月儿感觉有点冷。
    第三天她告诉月儿感觉有点头晕。
    那么问题来了,月儿如何根据阿驴的描述的情况,推断出这三天中阿驴的一个身体状态呢?

    因此,从HMM隐马尔科夫模型的角度来说,健康或者发烧 是身体隐含的状态state, 而正常,头晕或者冷是观察序列,

    因此这三天的观察序列为: 正常, 冷, 头晕, 而每天的身体隐含状况则未知, 这在HMM问题中属于解码问题,可以通过维特比算法,利用动态规划算法,来求解出整个HMM链中每天的隐含状态。


    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

    }

    这样就可以列出相应的观测矩阵:


    由上面我们可以发现,HMM的三要素都齐备了,下面就是解决问题了。
    阿驴连续三天的身体感觉依次是: 正常、冷、头晕 。

    3.题目:

    已知如上,求:阿驴这三天的身体健康状态变化的过程是怎么样的?即已知观测序列和HMM模型的情况下,求状态序列。
    4.过程:

    • 第一天的时候,观测值为正常, 因此对每一个状态(健康或者发烧)的情况下,根据状态分布矩阵与条件概率矩阵,求得观测值与每个状态的联合概率分布
    • P(正常,第一天健康) = P(正常|健康) * P(健康|初始情况) = 0.5 * 0.6 = 0.3
    • P(正常, 第一天发烧) = P(正常|发烧) * P(发烧|初始情况) = 0.1 * 0.4 = 0.04
    • 注意点:P(第一天健康) == P(正常,第一天健康), 因为观察值正常 是实际确定了的序列值,因此联合概率与隐含状态的概率 等价

    • 第二天的时候,观测值为冷,继续来求观测值与所有可能的隐含状态的联合概率, 而此时每个隐含状态(健康或者发烧),都要考虑上一个状态的概率以及到当前状态的条件转移概率分布,
    • 例如: 当前观测值为冷,假定当前隐含状态为健康,求当前的联合概率分布P(冷,第二天健康) 。首先从 昨天的状态到当前的健康状态 有两种路径(昨天的状态还没确定,而只是先计算出每个状态的概率分布): 昨天健康 ----> 今天健康, 昨天发烧 -----> 今天健康。 这两个路径分别的概率为 0.3 * 0.7 以及 0.04 * 0.4, 可以看到 当前如果为健康时,昨天为健康的概率更大,因此我们选定昨天健康 ----> 今天健康 这条路径,即记录下当前为健康时,昨天也为健康状态, 然后求得当前的联合概率分布 P(冷,第二天健康) = (0.3 * 0.7 ) * 0.4 = P(第二天健康), 即如下:
    • P(冷,第二天健康) = max{0.3*0.7, 0.04*0.4} * 0.4=0.3* 0.7 * 0.4=0.084 此时我们需要记录概率最大的路径的前一个状态,即0.084路径的前一个状态,我们在小本本上记下,第二天健康时,第一天的状态也为健康。
    • 同理, 假定当前隐含状态为发烧时求当前的联合概率分布P(冷,第二天发烧) 。一样的道理,从昨天的状态到当前的发烧状态也有两种路径: 昨天健康 ----> 今天发烧, 昨天发烧 -----> 今天发烧,这两个路径分别的概率为 0.3 * 0.3以及 0.04 * 0.6, 可以看到 当前如果为发烧时,昨天为健康的概率更大,因此我们选定昨天健康 ----> 今天发烧 这条路径,即记录下当前为发烧时,昨天也为健康状态, 当前的联合概率分布 P(冷,第二天发烧) = (0.3 * 0.3 ) * 0.3 = P(第二天发烧), 即如下:
    • P(冷,第二天发烧) = max{0.3*0.3, 0.04*0.6} * 0.3=0.027, 同样的在0.027这个路径上,第二天为发烧时,第一天也是健康的。

    • 第三天的时候,观察序列为头晕,仍旧来求第三天观察序列与所有状态的联合概率分布,此时通过第二天的计算,可以求得第二天的健康状态与发烧状态的概率分别0.084 和0.027,针对当前健康和发烧两个状态下,分别求昨天所有的状态到当前两个状态的各自所有路径,求得当前健康和发烧下的各自最大概率路径,得到:
    • P(第三天健康)=max{0.084*0.7, 0.027*0.4} * 0.1=0.00588,在这条路径上,当前第三天健康时,第二天是健康的。
    • P(第三天发烧)=max{0.084*0.3, 0.027*0.6} * 0.6=0.01512, 在这条路径上,当前第三天发烧时,第二天是健康的。

    • 假定到第三天是最后一天, 此时看第三天为发烧时状态概率最大,即为最优状态,即P(最优)=0.01512,这样我们可以得到最优路径的终点,是发烧状态

    • 由最优状态开始回溯。根据前面所记录的, 在求得第三天发烧的时候,我们记录的第二天最大概率的状态为健康,因此确定第二天为健康状态,继续回溯,当第二天为健康状态时,我们记录的第一天是健康的。这样,我们的状态序列逆推出来了。即为:健康,健康,发烧
    • 简略的画个图吧:

    • 注意点:图中求得max概率的时候 其实省略了 状态到观测值的概率,例如max = 0.084 = 03 * 0.7 * 0.3, 由于画图缘故省略了这一块,P(第一天健康) = P(正常,第一天健康), 因为观察值正常 是实际确定了的序列值,因此联合概率与隐含状态的概率 等价
    别人也给出了一个HMM概率图 可以参考下:
    这儿的箭头指向就是一个回溯查询小本本的过程,我们在编写算法的时候,其实也得注意,每一个概率最大的 单条路径 上都要把前一个状态记录下来。
    知乎上也有人给出了相应的代码实现:
    https://github.com/qqiang00/Machine-Learning-Samples/blob/master/mynltk/cn_viterbi.py

    后续CRF条件随机场其实也是强化版的马尔科夫随机场,核心还是维特比算法等等








     
    我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
    博主25岁,前端后端算法大数据人工智能都有兴趣。
    大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
    聊技术,交朋友,修心境,qq404006308,微信fan404006308
    26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
    人工智能群:939687837

    作者相关推荐

  • 相关阅读:
    特效优化
    Jsp
    JRebel 热部署
    mysql
    行为树
    Medium | LeetCode 139. 单词拆分 | 动态规划
    Medium | LeetCode 31. 下一个排列
    Easy | LeetCode 27. 移除元素 | 快慢指针
    Medium | LeetCode 437. 路径总和 III | 树 + 回溯 + 前缀和
    Medium | LeetCode 337. 打家劫舍 III | 树后序遍历 + 动态规划
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/14087815.html
Copyright © 2020-2023  润新知