我们看到的有多大可能?
设我们看到的波动是 小、大、大。在我们的模型下这个序列有多大可能?可以把所有隐含路径(平静-平静-平静、平静-平静-动荡……)列出来,算每条的概率再相加;但 K 个状态、T 天就有 KT 条路径,太多了。前向算法通过复用计算,用 T⋅K2 步算出同一个和。它保存一个数 αt(j):前 t 个观测出现、且第 t 天处于状态 j 的概率。
α1(j)=πjBj(o1),αt(j)=[i∑αt−1(i)Aij]Bj(ot),P(o1,…,oT)=j∑αT(j)(1) 用文字读一下这个递推:今天处于状态 j,就是昨天来自某个状态 i(按转移概率对 i 求和),然后今天的状态产生了今天的观测。把 αt 除以它的总和,就得到滤波概率,即已知截至今天的数据时你对今天状态的信念。有个实际问题:把许多小数相乘,数值会趋近于零而下溢。所以每一步都除以总和 ct 并保存起来,数据概率的对数就是各个 lnct 之和。
小、大、大第 1 天:
α1=(0.6⋅0.9, 0.4⋅0.3)=(0.54, 0.12),总和
c1=0.66。第 2 天(大波动):平静得到
(0.54⋅0.9+0.12⋅0.2)⋅0.1=0.051,动荡得到
(0.54⋅0.1+0.12⋅0.8)⋅0.7=0.105,总和
0.156,所以动荡的滤波概率为
0.105/0.156=0.673。第 3 天得
α3=(0.00669, 0.06237)。整个序列的概率为
0.00669+0.06237=0.0691,其对数为
−2.673。
- 前向算法:用 T⋅K2 步而不是 KT 步对所有隐含路径求和。
- 滤波概率:把 αt 归一化,就得到由截至今天的数据得出的对今天状态的信念。
- 缩放:每步除以 ct 并累加 lnct,以避免下溢。
实验:评分内容
- 第一个前向值15 分
- 第一天的总和10 分
- 两天后的滤波15 分
- 序列的概率15 分
- 对数似然10 分
- 前向算法节省了什么10 分
- 配对术语10 分
- 为什么要缩放这些值15 分