zoukankan      html  css  js  c++  java
  • 隐马尔可夫模型

    隐马尔可夫模型(HMM)是一种统计模型

    先来看一个维基百科提供的例子:

    https://en.wikipedia.org/wiki/Hidden_Markov_model

    假设你有一个住得很远的朋友,他每天跟你打电话告诉你他那天做了什么。你的朋友仅仅对三种活动感兴趣:公园散步,购物以及清理房间。他选择做什么事情只凭天气。你对于他所住的地方的天气情况并不了解,但是你知道总的趋势。在他告诉你每天所做的事情基础上,你想要猜测他所在地的天气情况。

    你知道这个地区的总的天气趋势,并且平时知道你朋友会做的事情.也就是说这个隐马尔可夫模型的参数是已知的

    这就是一个简单的 HMM,天气状况属于状态序列,而她的行为则属于观测序列。而根据天气的不同,有相对应的概率产生不同的行为。在这里,为了简化,把天气情况简单归结为晴天和雨天两种情况。雨天,他选择去散步,购物,收拾的概率分别是0.1,0.4,0.5, 而如果是晴天,他选择去散步,购物,收拾的概率分别是0.6,0.3,0.1。而天气的转换情况如下:这一天下雨,则下一天依然下雨的概率是0.7,而转换成晴天的概率是0.3;这一天是晴天,则下一天依然是晴天的概率是0.6,而转换成雨天的概率是0.4. 同时还存在一个初始概率,也就是第一天下雨的概率是0.6, 晴天的概率是0.4.

     

    我们的观察集合是: 

    V={散步,购物,收拾};

    所有的可能的观察数:

    M=3;

    观察者只能看到朋友的行为序列,却不能看到朋友所在地区的天气。

    我们的状态集合是:

    Q={雨天,晴天};

    所有的可能的状态数:

    N=2

    初始状态分布为:

    π=(0.6,0.4)T

    状态转移概率分布矩阵A:

     

    观测状态概率矩阵B:

     
     

    现在,重点是要了解并解决HMM 的三个问题:
    问题1,已知整个模型, 朋友告诉我,连续三天,他下班后做的事情分别是:散步,购物,收拾。那么,根据模型,计算产生这些行为的概率是多少。
    问题2,同样知晓这个模型,同样是这三件事, 朋友要我猜,这三天他下班后北京的天气是怎么样的。这三天怎么样的天气才最有可能让他做这样的事情。
    问题3,最复杂的, 朋友只告诉我这三天他分别做了这三件事,而其他什么信息我都没有。他要我建立一个模型,晴雨转换概率,第一天天气情况的概率分布,根据天气情况他选择做某事的概率分布。

     

    具体如何解决这三大问题。需要数学基础,概率基础。

    问题1的解决1:遍历算法。

    要计算产生这一系列行为的概率,那我们把每一种天气情况下产生这些行为都罗列出来,那每种情况的和就是这个概率。

    有3天,每天有2种可能的天气情况,则总共有

    种情况

    举例其中一种情况 :

    P(下雨,下雨,下雨,散步,购物,收拾)= P(第一天下雨)P(第一天下雨去散步)P(第二天接着下雨)P(下雨去购物)P(第三天还下雨)P(下雨回家收拾)=0.6X0.1X0.7X0.4X0.7X0.5=0.00588
    当然,这里面的 P(第二天接着下雨)当然是已知第一天下雨的情况下,第二天下雨的概率,为0.7.
    将八种情况相加可得,三天的行为为{散步,购物,收拾}的可能性为0.033612. 看似简单易计算,但是一旦观察序列变长,计算量就会非常庞大


    问题1 的解决2:向前算法。

    1)先计算 t=1时刻,发生‘’散步‘’一行为的概率:

    1.1)如果下雨,则为

    1.2)如果晴天:

    2)t=2 时刻,发生“购物”的概率,当然,这个概率可以从 t=1 时刻计算而来:

    2.1)如果t=2下雨,则

    2.2)如果 t=2晴天,则

    P(第一天散步,第二天购物,第二天晴天)=0.0486 (同理可得)

    3)t=2 时刻:

    3.1)如果 t=3,下雨,则

    3.2)如果t=3,晴天,则

    P(第一天散步,第二天购物,第三天收拾,第三天晴天)= 0.004572

    那么 P(第一天散步,第二天购物,第三天收拾),这一概率则是第三天,下雨和晴天两种情况的概率和:

    0.02904+0.004572=0.033612

    以上例子可以看出,向前算法计算了每个时间点时,每个状态的发生观测序列的概率,看似繁杂,但在 T 变大时,复杂度会大大降低。

     

    问题1的解决3:向后算法

    顾名思义,向前算法是在时间 t=1的时候,一步一步往前计算。而相反的,向后算法则是倒退着,从最后一个状态开始,慢慢往后推。
    给定的模型 ,观测序列O,定义t时刻状态为qi 的条件下,从t+1到T时刻的部分部分观察序列为Oi +1, Oi+2, ... , OT, 记作:
     

    可以用递归的方式求得后向概率

    及观测概率

    (1)初始化后向概率:

    (2)递推:

     

    其中第一项则是转移概率,第二天下雨转到第三天下雨的概率为0.7;第二项则是观测概率,第三天下雨的状况下,在家收拾的概率为0.5;第三项就是我们定义的向后变量

    同理,可得

    (3)终止:

    三种算法的答案是一致的

     

     
     
  • 相关阅读:
    c语言的注意事项(未完,以后遇到问题继续添加)
    const与指针的运用
    A7139射频模块wor配置解析
    lora项目注意事项(只用于本项目)
    串口通信数码管显示输入数字
    点阵图形上移
    按键弹起数字增加和按下增加
    数码管从999999倒计时
    中断与数码管秒表显示
    PHP控制连接打印机
  • 原文地址:https://www.cnblogs.com/zcjcsl/p/9483778.html
Copyright © 2011-2022 走看看