Использование pykalman - PullRequest
       86

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

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

Я хочу попробовать использовать 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)

1 Ответ

1 голос
/ 27 июня 2019

Посмотрим:

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

означает

Transition matrix

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

state vector

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

означает

Observation matrix

Размер матрицы наблюдения должен составлять [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(), потому что эта функция не выполняет прогнозирование при первом измерении, но я думаю, что должно.

...