隐半马尔可夫模型
隐半马尔可夫模型(hidden semi-Markov model,HSMM)是一种显式描述隐状态持续时长的序列模型。隐状态以分段形式存在,每段在同一状态中产生若干观测,再转入下一状态。与普通隐马尔可夫模型相比,它可以为持续时长指定非几何分布,例如固定两步、移位泊松或有界离散分布。
段状态、持续时间与观测
设第 段的状态为 ,相邻段按转移概率 变化。本文采用不允许相邻同状态段的约定 ;每一段持续 步,状态为 时 。给定段状态序列,各段持续时间条件独立,而且每段时长的分布只由该段当前状态决定,不再依赖相邻段状态或更早历史。给定所有段状态和时长,各时间观测条件独立,状态 的单点观测概率或密度为 。初始状态概率记为 。不同HSMM文献可能采用其他边界或自转移约定,比较公式时需先对齐。[1]
普通HMM若自转移概率为 ,状态驻留长度满足 。这来自先自转移 次再离开;即使在一个状态里已经停留很久,下一步离开的概率仍一样。若 ,该状态是吸收态,驻留时间为无穷,不再有上述有限几何分布。HSMM把有限驻留时长的几何约束单独放开。
两段观测的手算
取两状态 ,从 开始并交替转移。令 每段固定持续两步, 每段固定持续一步。观测为二元数,、。若恰在一个段结束时观察完三步,则唯一隐状态序列为 。对教学序列 ,联合观测概率是 三个因子对应三个具体观测,持续时长与转移在此例中都是确定的,故其概率因子均为一。
变式。 把第一段改为普通HMM的 ,恰持续两步的概率只有 。HSMM固定持续两步时该概率为一,两者不能只靠“平均时长都是二”视为相同模型。
按段结束的前向递推
令 表示已产生 ,且状态 的一段恰在 结束的联合概率。记段内观测乘积 。按最后一段长度 分类,有 若最后一段从第一步开始,使用初始概率;否则先在 结束上一段,再转入 。这些情形互不相交且穷尽所有以段结束的路径,所以求和既不重复,也不遗漏。[1]
是“这段观测且 恰为段边界”的联合概率。若记录只是任意时刻停止,末段可能尚未结束,必须使用持续时间尾概率计入右删失;把段结束概率直接当成一般序列似然,会漏掉路径。
有界持续时间的计算
下面实现上述段边界递推。输入是每时刻各状态的观测概率或密度矩阵、初始概率、无自转移的转移矩阵,以及各状态在一至 步上的持续时间概率。返回带有末端段边界条件的联合概率,不改输入;需要NumPy。长序列应改为缩放或对数计算,以免下溢。
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。有 个状态、最大持续时间 时,此直接实现用时 ,存储为 ,其中包含输入;更新段内乘积避免为每段重复遍历全部观测。
HSMM并不自动解决状态数选择、可识别性或错误观测分布。持续时长的灵活性增加了参数与计算负担,应通过留出序列和持续时间诊断检查它是否确有必要。
参考文献
- ↑ 1.0 1.1 Shun-Zheng Yu:Hidden semi-Markov models,Artificial Intelligence 174(2010):215–243,§2与显式持续时间模型部分。