Kalman Filterin с изменением известной дисперсии с течением времени?

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

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

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
t и e_2_t — они непостоянны. Есть ли пакет Python, который я мог бы использовать для оценки этой модели?

Параметр фи неизвестен. Было бы здорово, если бы модель могла оценить if. Если нет, то это также можно было бы представить, т.к. существуют приблизительные оценки.

Большое спасибо за любую подсказку.

PS: я также проверил библиотеку pykalman. https://pykalman.github.io/#mathematical-formulation. Кажется, что здесь предполагается, что дисперсия постоянна во времени.


person denniz    schedule 14.06.2019    source источник
comment
Вы хотите изменить ковариацию измерения и системного шума или только ковариацию измерения? У меня есть некоторые проблемы с интерпретацией ваших выражений.   -  person Anton    schedule 16.06.2019
comment
@Антон Привет. Я хотел бы изменить ковариацию выражения измерения. Таким образом, на основе уравнений в en.wikipedia.org/wiki/Kalman_filter это будет R_k. Причина в том, что у меня есть другое измерение вне системы, которое говорит мне, насколько точно наблюдение.   -  person denniz    schedule 16.06.2019


Ответы (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 и observation_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, иначе библиотека не работает.

person Anton    schedule 16.06.2019
comment
Большое спасибо. Я попробую это. На самом деле довольно забавно, я уже видел ваш пост, и хотя он может идти в этом направлении! Когда наблюдения отсутствуют, моя идея разместить фиктивное наблюдение и придать ему высокую дисперсию (я думаю, что это должно работать, если наблюдения не коррелированы, но это всего лишь частный случай). - person denniz; 16.06.2019