Фильтр Калмана с изменением известной дисперсии во времени?

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

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в противном случае библиотека не работает.

Другие вопросы по тегам