Если вам нужно изменить либо ковариацию перехода (матрица 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 и наблюдение_ковариантность
Посмотрите мой пост здесь: Фильтр Калмана сизменяющиеся временные шаги
В этом примере я изменил ковариацию наблюдений на лету в зависимости от датчика, из которого получено измерение:
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
, в противном случае библиотека не работает.