在 statsmodels 中使用卡尔曼滤波器时忽略 state_cov

Posted

技术标签:

【中文标题】在 statsmodels 中使用卡尔曼滤波器时忽略 state_cov【英文标题】:state_cov is being ignored when using the Kalman filter in statsmodels 【发布时间】:2021-08-27 01:08:00 【问题描述】:

我正在尝试创建一个从 statsmodels.tsa.statespace.MLEModel(下面的代码)派生的仿射期限结构模型,该模型使用最小二乘法进行初始化。

'''

class affine_term_structure(sm.tsa.statespace.MLEModel):
    def __init__(self, yields, tau, k_states=3, **kwargs):
       # Initialize the statespace
       super(affine_term_structure, self).__init__(yields, k_states=k_states, **kwargs)

       self.initialize_known(np.zeros(self.k_states), np.eye(self.k_states) * 10000)

    def update(self, params, **kwargs):
       params = super(dynamic_nelson_siegel, self).update(params, **kwargs)

       # Extract the parameters
       Phi = np.reshape(params[:9], (3, 3))
       k = np.array(params[9:12])
       Sx = np.zeros((3, 3))
       Sx[np.tril_indices(3)] = params[12:18]
       lmbd = params[18]
       sy = params[-1]

       b = self.nss(self.tau, lmbd)

       self['transition'] = Phi  # transition matrix
       self['state_intercept'] = k  # transition offset
       self['state_cov'] = Sx @ Sx.T  # transition covariance. 3x3 SPD matrix

       self['design'] = b  # design matrix
       # self['obs_intercept'] = 0  # observation intercept
       self['obs_cov'] = sy * sy * np.eye(self.k_endog)  # observation covariance

'''

但是,我注意到在运行过滤器/平滑器时,状态被过度平滑了。挖掘过滤结果,似乎 state_cov 没有用于预测步骤。

例如

self.predicted_state_cov[:,:,1]

匹配

self.transition[:,:,0] @ self.filtered_state_cov[:,:,0] @ self.transition[:,:,0].T

虽然我希望它等于

self.transition[:,:,0] @ self.filtered_state_cov[:,:,0] @ self.transition[:,:,0].T + self.state_cov[:,:,0]

为了良好的顺序,请注意所有参数矩阵都是时间不变的。

我不确定我在这里缺少什么,任何帮助将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

在 Statsmodels 中,状态方程为:

x(t+1) = T x(t) + R eta(t+1)

其中 eta(t+1) ~ N(0, Q)

当你设置state_cov时,你设置了Q,但你还需要设置R,即selection

例如,如果您希望状态方程为:

x(t+1) = T x(t) + eta(t+1)

然后你会做这样的事情:

self['selection'] = np.eye(3)

R 不是每个状态空间模型中的恒等式,它甚至不能总是被初始化为恒等矩阵,因为 x(t) 的维度和 eta(t) 的维度可以与众不同。这就是为什么 R 不会自动初始化为单位矩阵的原因。

【讨论】:

非常感谢乍得。我虽然错过了一些明显的东西,但我显然是。再次感谢您的快速回复。 没问题。这绝对是一个不幸的“陷阱”。

以上是关于在 statsmodels 中使用卡尔曼滤波器时忽略 state_cov的主要内容,如果未能解决你的问题,请参考以下文章

在视频稳定中使用卡尔曼滤波器或粒子滤波器平滑运动

如何在 Python 中使用卡尔曼滤波器获取位置数据?

在 Android 中使用 Fusion Provider 实现卡尔曼滤波器以获取 GPS 位置

在 R-Cran 中使用卡尔曼滤波器进行时间序列预测

卡尔曼滤波器中的 dt

卡尔曼滤波器 - 在 java 中 - 操作方法/API