跳至主要内容

状态空间模型:工作原理与应用场景

了解状态空间模型如何使用隐藏状态与观测来表征动态系统,包括状态与观测方程、卡尔曼滤波以及时间序列应用。
· 8分钟 阅读

使用 AI 探索

想象一艘在浓雾中航行的船。它的 GPS 含有噪声,洋流未知,且无法直接测量其精确位置,只能通过传感器读数近似推断。状态空间模型正是为这种问题而生:您关心的量是隐藏的,而您能获得的只是它的不完美测量。

本文将介绍状态空间模型的结构,如何通过滤波与平滑估计隐藏状态,卡尔曼滤波在其中的位置,以及如何在 Python 和 R 中实现这些模型。

什么是状态空间模型?

状态空间模型是一个数学框架,用于描述随时间变化且无法直接观测的系统。核心有两个量:状态,即在任一时刻真实刻画系统的底层信息;以及观测,即您实际获得的带噪声、间接的测量。

模型规定两件事:隐藏状态如何从一个时间步演化到下一个,以及隐藏状态如何生成您看到的观测。这种分离使该框架具备通用性。它广泛出现于信号处理、计量经济学、控制系统与机器学习中,往往人们没有意识到自己都在同一形式结构内工作。

状态空间模型如何工作

核心逻辑在每个时间步遵循一个简单序列:

前一状态 → 当前状态 → 观测

系统从之前的隐藏状态转移到新的状态。该转移可能包含随机性,因为真实系统并非完全可预测。随后,新状态会生成一个可观测的测量,该测量自带噪声。您从未直接看到状态,只能看到它不完美地产生的结果。

您能做的是利用每一个新观测来更新对隐藏状态的最佳估计。这就是推断问题,也是围绕状态空间模型的大多数算法机制要解决的事情。

隐藏状态随时间生成带噪声的观测。图片由作者提供。

状态方程与观测方程

模型的结构归结为两个方程:一个描述状态如何运动,一个描述您能测到什么。

状态方程

状态方程描述隐藏状态如何演化。标量形式为:

这里,zₜ 是当前隐藏状态,a 表示转移动力学(前一状态延续的强度),而 wₜ 是过程噪声——系统运动中的随机性。在多变量系统的矩阵形式下,a 变为转移矩阵,但思想完全相同。

观测方程

观测方程将隐藏状态与您测得的量相连:

yₜ 是观测到的测量值,c 定义观测关系,vₜ 是测量噪声。在考虑一般的矩阵形式之前,先从这样的标量版本入手。矩阵带来的是通用性,而非新思想。

一个简单的状态空间模型示例

想一辆在道路上行驶的汽车。其真实位置与速度是隐藏状态,您无法直接观测。您拥有的是带噪声的 GPS 读数。状态方程刻画位置与速度在时间步之间如何变化(汽车大致以相同速度前进)。观测方程将真实位置与可能有数米误差的 GPS 读数关联起来。

一个好的可视化会显示三条线:真实位置(平滑)、GPS 读数(围绕真值分散)以及模型的估计位置(接近真值,较原始 GPS 更平滑)。获得第三条线正是模型的全部工作。

如何估计状态

定义模型只是问题的一半,您还需要从现有观测中推断隐藏状态。三项任务覆盖了这一空间:

滤波仅使用截至当前的观测来估计当前状态——实时推断,适用于跟踪与控制。平滑利用给定时点前后全部观测来回溯修正估计——通常更准确,但需要完整序列。预测在观测到来之前向前外推估计未来状态。

大多数应用使用滤波。平滑适用于回顾性分析,当准确性比速度更重要时会用到。

卡尔曼滤波与状态空间模型

卡尔曼滤波是线性高斯状态空间模型中的滤波算法。需要精确区分:状态空间模型是模型本身;卡尔曼滤波是适用于其中某一类模型的推断方法。

该滤波以两个交替步骤运行。在预测步骤中,它使用状态方程将当前估计向前投射,同时给出该估计的不确定度量。在更新步骤中,新观测到来并修正估计。修正幅度取决于预测与测量各自的不确定性:若模型预测更可靠,观测的影响更小;若 GPS 信号干净而模型不确定,观测将占主导。这种按不确定性加权的融合让卡尔曼滤波在实践中奏效。

对于非线性或非高斯情形存在扩展:扩展卡尔曼滤波对动力学做线性化,无迹卡尔曼滤波采用更聪明的近似,而粒子滤波通过采样处理完全通用的情形。这些属于另一个话题。

状态空间模型的类型

根据您对动力学与噪声所愿意作出的假设不同,该框架涵盖多种设置。

线性高斯状态空间模型是经典设置:线性的转移与观测方程,高斯噪声。可直接应用卡尔曼滤波,且精确推断可行。

非线性状态空间模型在状态转移或观测关系不线性时出现——如单摆,或价格效应逐渐减弱的模型。此时不再存在精确推断。

非高斯状态空间模型放弃噪声服从正态分布的假设。计数数据、二元结果与重尾过程皆属此类。

状态空间模型与相关时间序列模型的对比

有必要明确比较几点,因为它们之间的边界比初看时更模糊。

状态空间模型 vs. ARIMA

ARIMA 直接对观测值及其过去误差建模,不引入任何隐藏状态。状态空间模型则显式引入潜在状态。话虽如此,ARIMA 可以改写为状态空间形式——因此两者并非如初看那般泾渭分明,软件在拟合 ARIMA 时往往也会在内部使用状态空间表示。

状态空间模型 vs. 隐马尔可夫模型

二者都包含隐藏状态。经典 HMM 使用离散潜在状态(系统处于k种模式之一),而大多数状态空间模型采用连续状态。用于语音识别时,离散模式更合理;用于跟踪物体运动时,连续状态更自然。

状态空间模型 vs. 结构性时间序列模型

结构性时间序列模型(将序列分解为趋势、季节性与不规则成分)通常是以状态空间模型来表述的,而不是与其竞争。它们是该框架的特定用例。

Python 与 R 中的状态空间模型

两种语言的流程类似——定义模型、拟合模型,并提取隐藏状态的估计。

Python 中的状态空间模型

statsmodels 库为拟合状态空间模型提供了简洁接口。以下是在一些时间序列数据上拟合局部水平模型(最简单的结构性模型,状态为随机游走,观测含噪声):

import statsmodels.api as sm

# Fit a local level (random walk plus noise) model
model = sm.tsa.UnobservedComponents(time_series, level='local level')
result = model.fit(disp=False)

# Filtered state estimates (the hidden level at each time step)
print(result.filtered_state[0])

# Forecast the next 10 periods
forecast = result.forecast(10)

滤波后的状态为您提供模型在各时点对隐藏水平的最佳估计。这才是您最关心的输出,而非参数本身。

R 中的状态空间模型

在 R 中,KFAS 包可处理高斯状态空间模型,如果您经常在这一领域工作,值得掌握。流程与 Python 相仿:定义模型对象、拟合,并提取平滑或滤波后的状态。解读隐藏状态估计,而不仅仅是拟合统计量。

library(KFAS)

# Fit a local level (random walk plus noise) model
model <- SSModel(time_series ~ SSMtrend(1, Q = NA), H = NA)
fit <- fitSSM(model, inits = c(log(1), log(1)))
out <- KFS(fit$model)

# Filtered state estimates (the hidden level at each time step)
out$att

# Forecast the next 10 periods
predict(fit$model, n.ahead = 10)

状态空间模型的优势与局限

与大多数建模框架相似,其优劣同源:您必须事先承诺一种结构。

优势: 它们不是掩盖隐藏过程,而是将其显式表示;它们天然处理随时间变化的系统;测量不确定性内生于模型,而非事后考虑;同一框架无需改变模型结构即可支持滤波、平滑与预测。

局限: 指定模型可能很难。您需要决定隐藏状态意味着什么以及如何演化,这需要真正的领域判断。对于非线性或非高斯系统,推断成本会很高。而且如果您对动力学或噪声的假设有误,估计结果也会以不总是显而易见的方式出错。

结语

状态空间模型描述两件事:不可观测的状态如何随时间演化,以及该状态如何生成您可测得的观测。这分别是状态方程与观测方程。其他内容(卡尔曼滤波、平滑、预测)都是关于如何根据数据推断隐藏状态。

我认为该框架的价值在于,它迫使您明确自己不知道的部分。与直接对观测建模(如 ARIMA)不同,您必须承诺一个关于底层过程的故事。这是一种约束,也是一种澄清。一旦写下您认为的隐藏状态及其运动方式,推断问题就变成了机械过程。最难的部分早已在建模时完成。

如果您来自经典时间序列方法领域,值得把状态空间模型作为独立方法来理解,而非仅视作已知方法的推广。我们的Python 时间序列课程涵盖更广泛的工具包;若您的下一站是隐马尔可夫模型或卡尔曼滤波,这里的概念基础可直接迁移。

Vinod Chugani

作者

Vinod Chugani

Vinod Chugani 的职业生涯始于东京,曾任摩根大通最年轻的对冲基金销售台负责人,随后在雷曼兄弟创下个人销售纪录,之后又打造了覆盖 30 个国家的电子分销业务,营收突破 1 亿新元,随后转向数据领域。他毕业于杜克大学经济学专业,亦为 NYC Data Science Academy 校友,并在 100 多名申请者中成为Hugo Bowne-Anderson 在 Maven 开设的 “Building AI Applications” 课程的三位奖学金获得者之一。目前,他为 DataCamp、KDnuggets、Machine Learning Mastery 和 Statology 撰稿,内容涵盖从统计学到代理式 AI 等主题,并在 NYC Data Science Academy 指导数据从业者,已完成超过 1,000 场一对一辅导。

 

常见问题

状态空间模型与 ARIMA 等时间序列模型有何不同?

ARIMA 直接建模观测值与其过去误差之间的关系——没有隐藏状态。状态空间模型引入一个潜在状态,由此生成观测。在实践中,许多时间序列模型(包括 ARIMA)都能写成状态空间形式,因此二者更偏互补而非竞争。

使用状态空间模型需要理解卡尔曼滤波吗?

不需要用于使用它们——Python 的 statsmodels 与 R 的 KFAS 等库会在内部完成滤波。但理解预测—更新的逻辑有助于解读输出,并在模型拟合不佳时调试问题。

何时应使用平滑而非滤波?

当您拥有完整数据集并希望获得最准确的状态估计时使用平滑——如回顾性分析、异常检测或清洗历史序列。数据流式到达、需要实时估计时使用滤波。

如果我的系统是非线性的会怎样?

标准卡尔曼滤波将不再精确适用。常见替代方法包括扩展卡尔曼滤波(围绕当前估计进行线性化)、无迹卡尔曼滤波(采用更优近似)以及粒子滤波(从状态分布采样,适用于通用情形)。

如何选择隐藏状态应包含哪些内容?

这是难点——也是建模决策,而非统计决策。隐藏状态应包含一切驱动下一次观测且您无法直接测量的因素。对运动物体,通常是位置与速度;对经济序列,可能是潜在趋势与季节成分。由简入繁,仅当简单模型明显失效时再增加复杂度。

状态空间模型能处理缺失观测吗?

可以,这也是其相对 ARIMA 等方法的一大优势。若某次观测缺失,滤波器只会跳过更新步骤并将预测向前传播。间隔期内不确定性自然上升,这正是正确的行为。

状态空间模型与 LSTM 等深度学习序列模型有何关系?

二者都对带隐藏状态的序列数据建模,但相似仅止于此。LSTM 从数据中学习状态动力学,结构不可解释;状态空间模型显式规定动力学并给出不确定性估计。若追求可解释性且数据量较小,状态空间模型往往更有用;若数据量大、模式复杂,神经方法在纯性能上常占优。

隐藏状态总是一维的吗?

不是。状态可以是任意维度的向量。在运动物体示例中,状态是二维的:位置与速度。在更复杂的结构性模型中,状态可能同时包含趋势成分、多重季节成分与回归项。矩阵形式可统一处理这些情形。

主题