Фильтр Калмана с изменением известной дисперсии во времени?
У меня есть простая модель Калмана:
y_1_t = (1 + phi) * alpha_t + e_1_t
y_2_t = (1 - phi) * alpha_t + e_2_t
alpha_t+1 = alpha_t + s_t
Теперь я знаю отклонения во времени для e_1_t и e_2_t - они не постоянны. Есть ли пакет Python, который я мог бы использовать для оценки этой модели?
Параметр фи неизвестен. Было бы здорово, если бы модель могла оценить, если. Если нет, то это также может быть предоставлено, поскольку существуют приблизительные оценки.
Большое спасибо за любой намек.
PS: я также проверил библиотеку pykalman. https://pykalman.github.io/. Кажется, что здесь предполагается, что дисперсия постоянна во времени.
1 ответ
Если вам нужно изменить либо ковариацию перехода (матрица Q
) или ковариация измерения (матрица R
) во время оценки вы все еще можете использовать pykalman
библиотека, которую вы упомянули в своем вопросе.
Посмотрите на функцию filter_update()
, Это полезно, если вы хотите изменить некоторые параметры фильтра (особенно ковариационные матрицы) от одного вызова к другому.
Вызов функции выглядит так:
filter_update(filtered_state_mean, filtered_state_covariance, observation=None, transition_matrix=None, transition_offset=None, transition_covariance=None, observation_matrix=None, observation_offset=None, observation_covariance=None)
чтобы изменить ковариационные матрицы, вам просто нужно поместить настроенные значения в transition_covariance и expression_covariance
Посмотрите мой пост здесь: фильтр Калмана с различными временными шагами
В этом примере я изменил ковариацию наблюдения на лету в зависимости от датчика, из которого получено измерение:
if Sensor[t] == 0:
obs = None
obs_cov = None
else:
obs = [X[t], Y[t]]
if Sensor[t] == 1:
obs_cov = np.asarray(R_1)
else:
obs_cov = np.asarray(R_2)
filtered_state_means[t], filtered_state_covariances[t] = (
kf.filter_update(
filtered_state_means[t-1],
filtered_state_covariances[t-1],
observation = obs,
observation_covariance = obs_cov)
)
По какой-то причине нужно привести ковариацию наблюдения к np.asarray
в противном случае библиотека не работает.