Использование пикальмана

Я хочу попробовать использовать pykalman для применения фильтра Калмана к данным из переменных датчика. Теперь у меня сомнения с данными наблюдений. В примере 3 наблюдения — это две переменные, измеренные в три момента времени, или 3 переменные, измеренные в момент времени.

from pykalman import KalmanFilter
>>> import numpy as np
>>> kf = KalmanFilter(transition_matrices = [[1, 1], [0, 1]], observation_matrices = [[0.1, 0.5], [-0.3, 0.0]])
>>> measurements = np.asarray([[1,0], [0,0], [0,1]])  # 3 observations
>>> kf = kf.em(measurements, n_iter=5)
>>> (filtered_state_means, filtered_state_covariances) = kf.filter(measurements)
>>> (smoothed_state_means, smoothed_state_covariances) = kf.smooth(measurements)

person JuanRoa    schedule 25.06.2019    source источник


Ответы (1)


Посмотрим:

transition_matrices = [[1, 1], [0, 1]]

означает

Матрица перехода

Итак, ваш вектор состояния состоит из 2 элементов, например:

вектор состояния

observation_matrices = [[0.1, 0.5], [-0.3, 0.0]]

означает

Матрица наблюдения

Размер матрицы наблюдения должен быть [n_dim_obs, n_dim_state]. Таким образом, ваш вектор измерений также состоит из 2 элементов.

Вывод: код имеет 3 observations of two variables measured at 3 different points in time.

Вы можете изменить данный код, чтобы он мог обрабатывать каждое измерение на временном шаге. Вы используете kf.filter_update() для каждого измерения вместо kf.filter() для всех измерений одновременно:

from pykalman import KalmanFilter
import numpy as np
kf = KalmanFilter(transition_matrices = [[1, 1], [0, 1]], observation_matrices = [[0.1, 0.5], [-0.3, 0.0]])
measurements = np.asarray([[1,0], [0,0], [0,1]])  # 3 observations
kf = kf.em(measurements, n_iter=5)

filtered_state_means = kf.initial_state_mean
filtered_state_covariances = kf.initial_state_covariance

for m in measurements:

    filtered_state_means, filtered_state_covariances = (
        kf.filter_update(
            filtered_state_means,
            filtered_state_covariances,
            observation = m)
        )

print(filtered_state_means);

Выход:

[-1.69112511  0.30509999]

Результат немного отличается от результата при использовании kf.filter(), потому что эта функция не выполняет предсказание по первому измерению, но я думаю, что должна.

person Anton    schedule 27.06.2019