跳到正文
格致开物MATHWIKI

隐半马尔可夫模型

隐半马尔可夫模型(hidden semi-Markov model,HSMM)是一种显式描述隐状态持续时长的序列模型。隐状态以分段形式存在,每段在同一状态中产生若干观测,再转入下一状态。与普通隐马尔可夫模型相比,它可以为持续时长指定非几何分布,例如固定两步、移位泊松或有界离散分布。

段状态、持续时间与观测

设第 r 段的状态为 Sr,相邻段按转移概率 aij=Pr⁡(Sr+1=j∣Sr=i) 变化。本文采用不允许相邻同状态段的约定 ajj=0;每一段持续 Dr≥1 步,状态为 j 时 Pr⁡(Dr=d∣Sr=j)=dj(d)。给定段状态序列,各段持续时间条件独立,而且每段时长的分布只由该段当前状态决定,不再依赖相邻段状态或更早历史。给定所有段状态和时长,各时间观测条件独立,状态 j 的单点观测概率或密度为 bj(y)。初始状态概率记为 πj。不同HSMM文献可能采用其他边界或自转移约定,比较公式时需先对齐。[1]

普通HMM若自转移概率为 0≤ajj<1,状态驻留长度满足 Pr⁡(D=d)=ajjd−1(1−ajj)。这来自先自转移 d−1 次再离开;即使在一个状态里已经停留很久,下一步离开的概率仍一样。若 ajj=1,该状态是吸收态,驻留时间为无穷,不再有上述有限几何分布。HSMM把有限驻留时长的几何约束单独放开。

两段观测的手算

取两状态 A,B,从 A 开始并交替转移。令 A 每段固定持续两步,B 每段固定持续一步。观测为二元数,Pr⁡(Y=1∣A)=0.8、Pr⁡(Y=1∣B)=0.2。若恰在一个段结束时观察完三步,则唯一隐状态序列为 A,A,B。对教学序列 (1,1,0),联合观测概率是 0.8×0.8×(1−0.2)=0.512. 三个因子对应三个具体观测,持续时长与转移在此例中都是确定的,故其概率因子均为一。

三个时间格,前两格处于A,第三格处于B,观测依次1、1、0
同一状态A覆盖两格,只有第二格结束后发生段转移。逐格观测概率的乘积为0.512。

变式。 把第一段改为普通HMM的 aAA=1/2,恰持续两步的概率只有 (1/2)(1/2)=1/4。HSMM固定持续两步时该概率为一,两者不能只靠“平均时长都是二”视为相同模型。

按段结束的前向递推

令 ηt(j) 表示已产生 y1,…,yt,且状态 j 的一段恰在 t 结束的联合概率。记段内观测乘积 Bj(s:t)=∏u=stbj(yu)。按最后一段长度 d 分类,有 ηt(j)=∑d=1tdj(d)Bj(t−d+1:t)[1{d=t}πj+1{d<t}∑iηt−d(i)aij]. 若最后一段从第一步开始,使用初始概率;否则先在 t−d 结束上一段,再转入 j。这些情形互不相交且穷尽所有以段结束的路径,所以求和既不重复,也不遗漏。[1]

∑jηT(j) 是“这段观测且 T 恰为段边界”的联合概率。若记录只是任意时刻停止,末段可能尚未结束,必须使用持续时间尾概率计入右删失;把段结束概率直接当成一般序列似然,会漏掉路径。

有界持续时间的计算

下面实现上述段边界递推。输入是每时刻各状态的观测概率或密度矩阵、初始概率、无自转移的转移矩阵,以及各状态在一至 D 步上的持续时间概率。返回带有末端段边界条件的联合概率,不改输入;需要NumPy。长序列应改为缩放或对数计算,以免下溢。

Python 3
import numpy as np

def hsmm_boundary_likelihood(emission, initial, transition, duration):
    e, pi, a, d = [np.asarray(v, dtype=float) for v in
                    (emission, initial, transition, duration)]
    if not (e.ndim == 2 and pi.ndim == 1 and d.ndim == 2):
        raise ValueError("invalid array dimensions")
    t_count, states = e.shape
    if not (t_count > 0 and states > 1 and a.shape == (states, states)
            and pi.shape == (states,) and d.shape[0] == states and d.shape[1] > 0):
        raise ValueError("incompatible shapes")
    if not all(np.all(np.isfinite(v)) and np.all(v >= 0) for v in (e, pi, a, d)):
        raise ValueError("finite nonnegative entries required")
    if not (np.isclose(pi.sum(), 1) and np.allclose(a.sum(axis=1), 1)
            and np.allclose(np.diag(a), 0) and np.allclose(d.sum(axis=1), 1)):
        raise ValueError("normalized probabilities and zero self transitions required")
    eta = np.zeros((t_count + 1, states))
    for t in range(1, t_count + 1):
        for j in range(states):
            segment = 1.0
            for length in range(1, min(t, d.shape[1]) + 1):
                segment *= e[t - length, j]
                previous = pi[j] if length == t else eta[t - length] @ a[:, j]
                eta[t, j] += d[j, length - 1] * segment * previous
    return float(eta[-1].sum())

print(hsmm_boundary_likelihood([[.8, .2], [.8, .2], [.2, .8]],
      [1, 0], [[0, 1], [1, 0]], [[0, 1], [1, 0]]))

结果为 0.512。有 q 个状态、最大持续时间 D 时,此直接实现用时 O(TDq2),存储为 O(Tq+q2+qD),其中包含输入;更新段内乘积避免为每段重复遍历全部观测。

HSMM并不自动解决状态数选择、可识别性或错误观测分布。持续时长的灵活性增加了参数与计算负担,应通过留出序列和持续时间诊断检查它是否确有必要。

参考文献

  1. ↑ 1.0 1.1 Shun-Zheng Yu:Hidden semi-Markov models,Artificial Intelligence 174(2010):215–243,§2与显式持续时间模型部分。