HMM之前向算法
HMM,隐马尔科夫模型。在5nlp上面讲的详细。
可以有这么一个有趣的联想。一对恋人中,女生有时候喜欢打男朋友,每天十二点可能发作一次。最奇怪是生气时候打,开心时候也打,有时候无缘无故平静还是打。晕。
(假设想当天十二点的心情需要参照前天十二点的心情。)能看到的就是妹子外在行动——打人,或者不打人。看不到的,就是隐含的变量:妹子的心情: 生气,平静,或者高兴。
那么对于这个事情可以这么建模。
隐马尔科夫模型M :
观测集合 V 为 {打人, 不打人}
状态集合 Q 为 {开心, 平静 , 生气}
状态转移矩阵 A P( 今天心情 | 昨天心情)的矩阵
混淆矩阵B P( 当天天的表现| 当天的心情)的矩阵
对于评估问题,就是由给定的模型M(指定了某个妹子),观测到最近妹子打你的序列是O(打,不打,打,打,不打) 由上面模型需要计算观测序列出现的概率P(O | M)。
如果直接计算计算量太大了。
解决这种问题要用到前向算法。
前向算法需要关注的是,前向概率的定义(52nlp称之为局部概率)和 算法初值t = 1时候前向概率的计算。
前向概率在李航老师《统计学习方法》中的定义为:
给定隐马尔科夫模型 M ,定义到时刻 t 部分观测序列为o_1, o_2, ……o_t,且状态为 q_i 的概率为前向概率,记作
a_t (i) = P( o_1, o_2, ……o_t, i_t = q_t | M)
举个例子,求 t = 3 ,状态为 q_2的前向概率。
现在 t = 3 就是在t = 3 时看到观测序列为(打,不打,打), 并且现在 t = 3 时候妹子心情状态为平静的概率。
怎么求?看昨天情况呗。 昨天打没打你和今天打没打你无关,但是妹子昨天的心情会影响到妹子今天的心情。所以需要结合昨天妹子表现分别计算 昨天妹子生气,平静,高兴情况下是今天心情平静的概率。然后,和在这种平静情况下妹子打人的概率乘一乘,要求的前向概率就出来了。
目前有个大的问题就是,最初的那个观测(打)之前没有观测,怎求这个观测中的前向概率?看看512nlp的博客就会发现,小菜一碟的。
现在这个事情发生了,就这么认为:P(state | t = 1) = P(state),因此,t = 1 时的前向概率等于当前状态的初始概率乘以相关的混淆概率。
现在,将 t = 1 时候的观测为(打)时候的各种前向概率计算出来。
利用昨天t = 1时候的前向概率信息,将t = 2 时候观测为(打,不打)时候前向概率计算出来。
利用昨天t = 2时候的前向概率信息,将t = 3 时候观测为(打,不打,打)时候前向概率计算出来。
…………
利用昨天t = 4时候的前向概率信息,将t = 5 时候观测为(打,不打,打,打,不打)时候前向概率计算出来。
再将t = 5 ,各种前向概率进行汇总,则求出我们想要的结果————指定妹子,观测到最近妹子打你的序列是(打,不打,打,打,不打) 由上面模型需要计算观测序列出现的概率P(O | M
转自 CSDN hellonlp
——来自##36##琥珀