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