IMM Estimator

needs documentation….


Copyright 2015 Roger R Labbe Jr.

FilterPy library. http://github.com/rlabbe/filterpy

Documentation at: https://filterpy.readthedocs.org

Supporting book at: https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python

This is licensed under an MIT license. See the readme.MD file for more information.

class filterpy.kalman.IMMEstimator(filters, mu, M)[source]

Implements an Interacting Multiple-Model (IMM) estimator.

Parameters:
filters : (N,) array_like of KalmanFilter objects

List of N filters. filters[i] is the ith Kalman filter in the IMM estimator.

Each filter must have the same dimension for the state x and P, otherwise the states of each filter cannot be mixed with each other.

mu : (N,) array_like of float

mode probability: mu[i] is the probability that filter i is the correct one.

M : (N, N) ndarray of float

Markov chain transition matrix. M[i,j] is the probability of switching from filter j to filter i.

References

Bar-Shalom, Y., Li, X-R., and Kirubarajan, T. “Estimation with Application to Tracking and Navigation”. Wiley-Interscience, 2001.

Crassidis, J and Junkins, J. “Optimal Estimation of Dynamic Systems”. CRC Press, second edition. 2012.

Labbe, R. “Kalman and Bayesian Filters in Python”. https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python

Examples

>>> import numpy as np
>>> from filterpy.common import kinematic_kf
>>> kf1 = kinematic_kf(2, 2)
>>> kf2 = kinematic_kf(2, 2)
>>> # do some settings of x, R, P etc. here, I'll just use the defaults
>>> kf2.Q *= 0   # no prediction error in second filter
>>>
>>> filters = [kf1, kf2]
>>> mu = [0.5, 0.5]  # each filter is equally likely at the start
>>> trans = np.array([[0.97, 0.03], [0.03, 0.97]])
>>> imm = IMMEstimator(filters, mu, trans)
>>>
>>> for i in range(100):
>>>     # make some noisy data
>>>     x = i + np.random.randn()*np.sqrt(kf1.R[0, 0])
>>>     y = i + np.random.randn()*np.sqrt(kf1.R[1, 1])
>>>     z = np.array([[x], [y]])
>>>
>>>     # perform predict/update cycle
>>>     imm.predict()
>>>     imm.update(z)
>>>     print(imm.x.T)

For a full explanation and more examples see my book Kalman and Bayesian Filters in Python https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python

Attributes:
x : numpy.array(dim_x, 1)

Current state estimate. Any call to update() or predict() updates this variable.

P : numpy.array(dim_x, dim_x)

Current state covariance matrix. Any call to update() or predict() updates this variable.

x_prior : numpy.array(dim_x, 1)

Prior (predicted) state estimate. The *_prior and *_post attributes are for convienence; they store the prior and posterior of the current epoch. Read Only.

P_prior : numpy.array(dim_x, dim_x)

Prior (predicted) state covariance matrix. Read Only.

x_post : numpy.array(dim_x, 1)

Posterior (updated) state estimate. Read Only.

P_post : numpy.array(dim_x, dim_x)

Posterior (updated) state covariance matrix. Read Only.

N : int

number of filters in the filter bank

mu : (N,) ndarray of float

mode probability: mu[i] is the probability that filter i is the correct one.

M : (N, N) ndarray of float

Markov chain transition matrix. M[i,j] is the probability of switching from filter j to filter i.

cbar : (N,) ndarray of float

Total probability, after interaction, that the target is in state j. We use it as the # normalization constant.

likelihood: (N,) ndarray of float

Likelihood of each individual filter’s last measurement.

omega : (N, N) ndarray of float

Mixing probabilitity - omega[i, j] is the probabilility of mixing the state of filter i into filter j. Perhaps more understandably, it weights the states of each filter by:

x_j = sum(omega[i,j] * x_i)

with a similar weighting for P_j

__init__(filters, mu, M)[source]

x.__init__(…) initializes x; see help(type(x)) for signature

update(z)[source]

Add a new measurement (z) to the Kalman filter. If z is None, nothing is changed.

Parameters:
z : np.array

measurement for this update.

predict(u=None)[source]

Predict next state (prior) using the IMM state propagation equations.

Parameters:
u : np.array, optional

Control vector. If not None, it is multiplied by B to create the control input into the system.