Скажем, у меня есть временной ряд t
и прогнозы (в процентах) для другого временного ряда f
. Прогнозы для f
обозначаются f_k
.
. Я хочу использовать фильтр Калмана для вывода прогнозов на t
, так как я предполагаю, что между k
и f
существует некоторая степень корреляции. Для этого я использую pykalman
.
. Он отлично работает в одномерном режиме, как показано ниже:
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
обрабатывает наблюдения для каждого измерения в последовательном времени?
Дополнительный вопрос: существуют ли другие (более разумные) способы получения прогнозов для t
с использованием прогнозов из f
с использованием фильтра Калмана, если предположить, что f
и t
коррелированы?