PytensorRepresentation#
- class pymc_extras.statespace.core.PytensorRepresentation(k_endog: int, k_states: int, k_posdef: int, design: ndarray | None = None, obs_intercept: ndarray | None = None, obs_cov=None, transition=None, state_intercept=None, selection=None, state_cov=None, initial_state=None, initial_state_cov=None)[source]#
用于保存线性高斯状态空间模型所需的所有对象的核心类
线性状态空间模型的符号表示法取自 [1],而具体实现则改编自 statsmodels 的实现:statsmodels/statsmodels,在 [2] 中描述。
- 参数:
k_endog (int) – 观测状态的数量(在 statsmodels 中称为“内生状态”)
k_states (int) – 隐藏状态的数量
k_posdef (int) – 具有外生冲击的状态数量;也是选择矩阵 R 的秩。
design (ArrayLike, 可选) – 设计矩阵,在 [1] 中表示为 ‘Z’。
obs_intercept (ArrayLike, 可选) – 观测方程中的常数向量,在 [1] 中表示为 ‘d’。目前未使用。
obs_cov (ArrayLike, 可选) – 观测方程中多元正态误差的协方差矩阵。在 [1] 中表示为 ‘H’。
transition (ArrayLike, 可选) – 在时间步之间更新隐藏状态的转移方程。在 [1] 中表示为 ‘T’。
state_intercept (ArrayLike, 可选) – 观测方程的常数向量,在 [1] 中表示为 ‘c’。目前未使用。
selection (ArrayLike, 可选) – 将冲击与隐藏状态匹配的选择矩阵,在 [1] 中表示为 ‘R’。当 k_posdef = k_states 时,这是单位矩阵。
state_cov (ArrayLike, 可选) – 状态方程的协方差矩阵,在 [1] 中表示为 ‘Q’。当没有观测噪声时为零矩阵。
initial_state (ArrayLike, 可选) – 允许贝叶斯估计初始状态的实验性设置,在 [1] 中表示为 alpha_0。默认值应可能被移除,以支持闭式扩散初始化。
initial_state_cov (ArrayLike, 可选) – 允许贝叶斯估计初始状态的实验性设置,在 [1] 中表示为 P_0。默认值应可能被移除,以支持闭式扩散初始化。
注释
线性状态空间系统由两个方程定义
\[\begin{split}\begin{align} x_t &= A_t x_{t-1} + c_t + R_t \varepsilon_t \tag{1} \\ y_t &= Z_t x_t + d_t + \eta_t \tag{2} \\ \end{align}\end{split}\]其中 \(\{x_t\}_{t=0}^T\) 是隐藏状态的轨迹,\(\{y_t\}_{t=0}^T\) 是可观测状态的轨迹。方程 1 被称为“状态转移方程”,它描述了系统如何随时间演变。方程 2 是“观测方程”,它将潜在状态过程映射到观测数据。当创新 \(\varepsilon_t\) 和测量误差 \(\eta_t\) 服从正态分布时,系统是高斯的。该定义通过指定这些分布以及初始状态分布来完成
\[\begin{split}\begin{align} \varepsilon_t &\sim N(0, Q_t) \tag{3} \\ \eta_t &\sim N(0, H_t) \tag{4} \\ x_0 &\sim N(\bar{x}_0, P_0) \tag{5} \end{align}\end{split}\]构成方程 1 至 5 的 9 个矩阵汇总在下表中。我们称 \(N\) 为观测次数,\(m\) 为隐藏状态数,\(p\) 为观测状态数,\(r\) 为创新数。
名称
符号
形状
初始隐藏状态均值
\(x_0\)
\(m \times 1\)
初始隐藏状态协方差
\(P_0\)
\(m \times m\)
隐藏状态向量截距
\(c_t\)
\(m \times 1\)
观测状态向量截距
\(d_t\)
\(p \times 1\)
转移矩阵
\(T_t\)
\(m \times m\)
设计矩阵
\(Z_t\)
\(p \times m\)
选择矩阵
\(R_t\)
\(m \times r\)
观测噪声协方差
\(H_t\)
\(p \times p\)
隐藏状态创新协方差
\(Q_t\)
\(r \times r\)
上面列出的形状是核心形状,但在一般情况下,所有这些矩阵(除了 \(x_0\) 和 \(P_0\))都可以是时变的。在这种情况下,可以添加形状为 \(n\) 的时间维度,等于观测次数。
警告
时间维度在卡尔曼滤波期间用作批次维度,因此必须始终是最左边的维度。
此类别的目的是存储这些矩阵,并允许用户轻松地索引它们。矩阵存储为 pytensor
TensorVariables
,形状已知。形状始终可以通过.type.shape
方法访问,该方法永远不应返回None
。在首先按所需数组的名称进行索引后,可以通过正常的 numpy 数组切片访问矩阵。时间维度存储在最左侧,并且会自动切片掉,除非用户明确请求。有关详细信息,请参见示例。示例
from pymc_extras.statespace.core.representation import PytensorRepresentation ssm = PytensorRepresentation(k_endog=1, k_states=3, k_posdef=1) # Access matrices by their names print(ssm['transition'].type.shape) >>> (3, 3) # Slice a matrices print(ssm['observation_cov', 0, 0].eval()) >>> 0.0 # Set elements in a slice of a matrix ssm['design', 0, 0] = 1 print(ssm['design'].eval()) >>> np.array([[1, 0, 0]]) # Setting an entire matrix is also permitted. If you set a time dimension, it must be the first dimension, and # the "core" dimensions must agree with those set when the ssm object was instantiated. ssm['obs_intercept'] = np.arange(10).reshape(10, 1) # 10 timesteps print(ssm['obs_intercept'].eval()) >>> np.array([[1.], [2.], [3.], [4.], [5.], [6.], [7.], [8.], [9.]])
参考文献
- __init__(k_endog: int, k_states: int, k_posdef: int, design: ndarray | None = None, obs_intercept: ndarray | None = None, obs_cov=None, transition=None, state_intercept=None, selection=None, state_cov=None, initial_state=None, initial_state_cov=None) None [source]#
方法
__init__
(k_endog, k_states, k_posdef[, ...])copy
()属性
k_endog
k_states
k_posdef
shapes
design
obs_intercept
obs_cov
transition
state_intercept
selection
state_cov
initial_state
initial_state_cov