0

I want to try to use pykalman to apply a kalman filter to data from sensor variables. Now, I have a doubt with the data of the observations. In the example, the 3 observations are two variables measured in three instants of time or are 3 variables measured in a moment of time

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)
Anton
  • 4,544
  • 2
  • 25
  • 31
JuanRoa
  • 11
  • 2
  • 7

1 Answers1

1

Let's see:

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

means

Transition matrix

So your state vector consists of 2 elements, for example:

state vector

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

means

Observation matrix

The dimension of an observation matrix should be [n_dim_obs, n_dim_state]. So your measurement vector also consists of 2 elements.

Conclusion: the code has 3 observations of two variables measured at 3 different points in time.

You can change the given code so it can process each measurement at a time step. You use kf.filter_update() for each measurement instead of kf.filter() for all measurements at once:

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);

Output:

[-1.69112511  0.30509999]

The result is slightly different as when using kf.filter() because this function does not perform prediction on the first measurement, but I think it should.

Anton
  • 4,544
  • 2
  • 25
  • 31