【发布时间】:2022-01-18 22:34:22
【问题描述】:
是否可以实现类似于Bayesian Filtering and Smoothing 中提出的模型,例如 statsmodels 中的示例 3.6?
我可以按照提供的 Matlab 代码进行操作,但我不确定这种模型是否以及如何在 statsmodels 中实现。
该示例涉及跟踪对象在 2D 空间中的位置。状态是四维的x=(x_1, x_2, x_3, x_4),但我重新排列了向量,使(x_1, x_3) 代表位置,(x_2, x_4) 代表两个方向上的速度。过程的Simulated data 由 100 个位置观察组成,排列在 2x100 矩阵中Y。
import numpy as np
from scipy import linalg
# The matrices in the dynamic model are set up as follows
q, dt, s = 1, 0.1, 0.5
A = np.array([[1, dt, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, dt],
[0, 0, 0, 1]])
Q = q * np.array([[dt ** 3 / 3, dt ** 2 / 2, 0, 0],
[dt ** 2 / 2, dt, 0, 0],
[0, 0, dt ** 3 / 3, dt ** 2 / 2],
[0, 0, dt ** 2 / 2, dt]])
# Matrices in the measurement model are designed as follows
H = np.array([[1, 0, 0, 0],
[0, 0, 1, 0]])
R = s ** 2 * np.eye(2)
# Starting values
m0 = np.array([[0, 1, 0, -1]]).T # column vector
P0 = np.eye(4)
然后按如下方式实现该过程的卡尔曼滤波器:
n = 100
m = m0
P = P0
kf_m = np.zeros((m.shape[0], n))
kf_P = np.zeros((P.shape[0], P.shape[1], n))
for k in range(n):
m = A @ m
P = A @ P @ A.T + Q
S = H @ P @ H.T + R
K = linalg.lstsq(S.T, (P @ H.T).T)[0].T
m = m + K @ (Y[:, k, np.newaxis] - H @ m)
P = P - K @ S @ K.T
kf_m[:, k] = m.flatten()
kf_P[:, :, k] = P
如果可能的话,如何在 statsmodels 中实现此过滤器?如果数据大得多,statsmodels 可能会更有效地运行,并且可以在子类中的过滤器上实现更平滑。
【问题讨论】:
-
添加到目前为止您尝试过的代码或示例?这个问题太开放了。
标签: python statsmodels state-space