Фильтр Калмана с изменением известной дисперсии во времени? - PullRequest
1 голос
/ 14 июня 2019

У меня есть простая модель Калмана:

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/#mathematical-formulation. Кажется, что здесь предполагается, что дисперсия постоянна во времени.

1 Ответ

0 голосов
/ 16 июня 2019

Если вам нужно изменить либо ковариацию перехода (матрица 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, в противном случае библиотека не работает.

...