pykalman的使用

Use of pykalman

我想尝试使用 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)

让我们看看:

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() 时略有不同,因为此函数不会对第一次测量进行预测,但我认为应该如此。