假设我有一个时间序列t
和另一个时间序列f
的预测(以百分比增长为单位)。对f
的预测用f_k
表示。你知道吗
我想用Kalman滤波器来推断t
的预测,因为我假设k
和f
之间存在某种程度的相关性。为此,我使用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]
在这里,我们清楚地看到黄色趋势如何过滤掉信号中的噪声。你知道吗
然而,我希望在下面的例子中看到完全相同的结果,其中观测值是二维的,状态空间保持不变,观测矩阵只使用第一维。你知道吗
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]
取而代之的是,卡尔曼滤波器在前半个时间段使用第一组观测值,在后半个时间段使用第二个维度。如果我包括三维,它会显示其中的3个峰。我不明白为什么会这样,因为指定了observation_matrices=np.array([[1],[0]])
(在查看源代码pykalman github时)。你知道吗
阅读这里的类似问题,似乎observation_matrix
是将状态空间映射到观察空间的矩阵H
:z = Hx
。但是,在Pykalman中,没有一个选项可以将观察空间映射到我所看到的状态空间(这将直接在observations
中完成)。你知道吗
因此,在这种情况下,在观察空间中包含比在状态空间中更多的维度有意义吗?这有意义吗?为什么Pykalman
在连续时间内处理每个维度的观察值?你知道吗
附加问题:假设f
和t
是相关的,有没有其他(更聪明的)方法来推断t
的预测?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐