卡尔曼滤波中使用pykalman的观察矩阵

2024-04-25 00:49:15 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个时间序列t和另一个时间序列f的预测(以百分比增长为单位)。对f的预测用f_k表示。你知道吗

我想用Kalman滤波器来推断t的预测,因为我假设kf之间存在某种程度的相关性。为此,我使用pykalman。你知道吗

它在1D环境下工作得非常好,如下图所示:

n_timesteps = t.shape[0]

observations = t.values * ((f_k - f)/f + 1).reshape(-1,1)
model = stl.decompose(t, period=52, lo_delta=0.01, lo_frac=0.2)
observations = model.trend.reshape(-1,1) * ((f_k - f)/f + 1).reshape(-1,1) # Get trend
kf = KalmanFilter(n_dim_obs=1, n_dim_state=1)

states_pred = kf.em(observations).filter(observations)[0]

enter image description here

在这里,我们清楚地看到黄色趋势如何过滤掉信号中的噪声。你知道吗

然而,我希望在下面的例子中看到完全相同的结果,其中观测值是二维的,状态空间保持不变,观测矩阵只使用第一维。你知道吗

m = stl.decompose(t.values * ((f_k - f)/f + 1), period=52, lo_delta=0.01, lo_frac=0.2)
obs1 = m.trend.reshape(-1,1) * ((f_k - f)/f + 1).reshape(-1,1)
obs2 = m.trend.reshape(-1,1) * ((f_k - f)/f + 1).reshape(-1,1)
observations = np.array([obs1,obs2]).reshape(-1,2)

em_vars = ['transition_offsets', 'transition_matrices', 'observation_covariance',
           'observation_offsets', 'transition_covariance',
           'initial_state_mean', 'initial_state_covariance'] 

kf = KalmanFilter(n_dim_obs=2, n_dim_state=1, observation_matrices=np.array([[1],[0]]))
states_pred = kf.em(observations, em_vars=em_vars).filter(observations)[0]

enter image description here

取而代之的是,卡尔曼滤波器在前半个时间段使用第一组观测值,在后半个时间段使用第二个维度。如果我包括三维,它会显示其中的3个峰。我不明白为什么会这样,因为指定了observation_matrices=np.array([[1],[0]])(在查看源代码pykalman github时)。你知道吗

阅读这里的类似问题,似乎observation_matrix是将状态空间映射到观察空间的矩阵Hz = Hx。但是,在Pykalman中,没有一个选项可以将观察空间映射到我所看到的状态空间(这将直接在observations中完成)。你知道吗

因此,在这种情况下,在观察空间中包含比在状态空间中更多的维度有意义吗?这有意义吗?为什么Pykalman在连续时间内处理每个维度的观察值?你知道吗

附加问题:假设ft是相关的,有没有其他(更聪明的)方法来推断t的预测?你知道吗


Tags: lo状态np时间空间varsarraytrend