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