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