Матрица наблюдения в фильтре Калмана с использованием Пикальмана - PullRequest
0 голосов
/ 11 октября 2019

Скажем, у меня есть временной ряд 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]

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 - это матрицаH, который отображает пространство состояний в пространство наблюдения: z = Hx. Однако в Pykalman нет возможности отобразить пространство наблюдения в пространство состояний, как я его вижу (это было бы сделано непосредственно в observations).

Следовательно, имеет ли смысл в этом контексте включать больше измерений в пространство наблюдения, чем в пространство состояний? Имеет ли это когда-нибудь смысл? Почему Pykalman обрабатывает наблюдения для каждого измерения в последовательном времени?

Дополнительный вопрос: существуют ли другие (более разумные) способы получения прогнозов для t с использованием прогнозов из f с использованием фильтра Калмана, если предположить, что f и t коррелированы?

...