Choosing a Filter
Use this guide to pick the right filter for your problem.
Decision Flowchart
Is the system linear?
|
+-- YES --> KalmanFilter
| (fastest, optimal for linear-Gaussian)
|
+-- NO
|
Is the noise Gaussian?
|
+-- NO --> ParticleFilter
| (handles any distribution, multimodal)
|
+-- YES
|
Can you compute Jacobians?
|
+-- YES --> ExtendedKalmanFilter
| (fast, needs analytical derivatives)
|
+-- NO
|
Is the state dimension large (>100)?
|
+-- YES --> EnsembleKalmanFilter
| (scales to millions of states, Dask-parallel)
|
+-- NO --> UnscentedKalmanFilter
(sigma-point accuracy, no Jacobians)
Filter Comparison
Property |
KF |
EKF |
UKF |
EnKF |
PF |
|---|---|---|---|---|---|
Linearity |
Linear |
Nonlinear |
Nonlinear |
Nonlinear |
Any |
Noise assumption |
Gaussian |
Gaussian |
Gaussian |
Gaussian |
Any |
Jacobians needed |
No |
Yes |
No |
No |
No |
Multimodal support |
No |
No |
No |
No |
Yes |
Smoothing |
RTS |
RTS |
– |
– |
– |
Forecasting |
Yes |
– |
– |
– |
– |
Dask parallel |
– |
– |
– |
Yes |
Yes |
Computation cost |
O(n^3) |
O(n^3) |
O(n^3) |
O(n^2 * M) |
O(n * N) |
Best accuracy |
Linear systems |
Mild nonlinearity |
Strong nonlinearity |
High-dim |
Multimodal |
Where n = state dimension, M = ensemble size, N = particle count.
When to Use Each Filter
KalmanFilter
GPS/INS navigation with linear dynamics
Signal denoising (e.g., sensor data, images, EEG)
Financial time series smoothing
Any system where
x_{k+1} = F @ x_k + noise
ExtendedKalmanFilter
Radar tracking (range + bearing observations)
Satellite orbit determination
SLAM (simultaneous localization and mapping)
Systems where you can derive Jacobians analytically
UnscentedKalmanFilter
Same problems as EKF but without needing Jacobians
Strongly nonlinear dynamics where EKF linearization is poor
Faster prototyping (just provide
f(x)andh(x))
EnsembleKalmanFilter
Weather prediction / data assimilation
Ocean current modeling
Any system with state dimension > 100 where full covariance is infeasible
Set
use_dask=Truefor parallel ensemble propagation
ParticleFilter
Robot localization with landmark observations
Target tracking with clutter
Multimodal posterior distributions
Non-Gaussian noise (e.g., heavy-tailed, uniform)
Memory Efficiency
For long time series, disable covariance storage:
kf = KalmanFilter(F, H, Q, R, x0, P0, store_covariances=False)
kf.fit(million_step_data) # only stores state estimates
states = kf.predict() # works
# kf.smooth() # raises error (needs stored covariances)
This saves approximately 80% of memory for the KalmanFilter on long sequences.