Skip to main content

Optimized Kalman Filter

Get an optimized Kalman Filter from data of system-states and observations.

This package implements the algorithm introduced in the paper Kalman Filter Is All You Need: Optimization Works When Noise Estimation Fails, by Greenberg, Mannor and Yannay.

Background: the Kalman Filter

The Kalman Filter (KF) is a popular algorithm for filtering problems such as state estimation, smoothing, tracking and navigation. For example, consider tracking a plane using noisy measurements (observations) from a radar. Every time-step, we try to predict the motion of the plane, then receive a new measurement from the radar and update our belief accordingly.

An illustration of a single step of the Kalman Filter: predict the next state (black arrow); receive a new observation (green ellipse); update your belief about the state (mixing the two right ellipses) (image by Ido Greenberg)
A diagram of the Kalman Filter algorithm (image by Ido Greenberg)

To tune the KF, one has to determine the parameters representing the measurement (observation) noise and the motion-prediction noise, expressed as covariance matrices R and Q. Given a dataset of measurements {z_t} (e.g. from the radar), tuning these parameters may be a difficult task, and has been studied for many decades. However, given data of both measurements {z_t} and true-states {x_t} (e.g. true plane locations), the parameters R,Q are usually estimated from the data as the sample covariance matrices of the noise.

When to use this package

When you want to build a Kalman Filter for your problem, and you have a training dataset with sequences of both states {x_t} and observations {z_t}.

Why to use

Tuning the KF parameters through noise estimation (as explained above) yields optimal model predictions - under the KF assumptions. However, as shown in the paper, whenever the assumptions do not hold, optimization of the parameters may lead to more accurate predictions. Since most practical problems do not satisfy the assumptions, and since assumptions violations are often not noticed at all by the user, optimization of the parameters is a good practice whenever a corresponding dataset is available.

How to use

Usage example: example.ipynb.

Data

The data consists of 2 lists of length n, where n is the number of trajectories in the data:

  1. X[i] = a numpy array of type double and shape (n_time_steps(trajectory i), state_dimension).
  2. Z[i] = a numpy array of type double and shape (n_time_steps(trajectory i), observation_dimension).

For example, if a state is 4-dimensional (e.g. (x,y,vx,vy)) and an observation is 2-dimensional (e.g. (x,y)), and the i'th trajectory has 30 time-steps, then X[i].shape is (30,4) and Z[i].shape is (30,2).

Below we assume that Xtrain, Ztrain, Xtest, Ztest correspond to train and test datasets of the format specified above.

KF configuration

The configuration of the KF has to be specified as a dict model_args containing the following entries:

  • dim_x: the number of entries in a state
  • dim_z: the number of entries in an observation
  • init_z2x: a function that receives the first observation and returns the first state-estimate
  • F: the dynamics model: a pytorch tensor of type double and shape (dim_x, dim_x)
  • H: the observation model: a pytorch tensor of type double and shape (dim_z, dim_x); or a function that returns such a tensor given the estimated state and the current observation
  • loss_fun: function(predicted_x, true_x) used as loss for training and evaluation

See an example here.

Train and test

import okf

model = okf.OKF(**model_args) # set optimize=False for the standard KF baseline

okf.train(model, Ztrain, Xtrain)

loss = okf.test_model(model, Ztest, Xtest, loss_fun=model_args['loss_fun'])

Analysis

See example.ipynb.

Metadata

Release files for Optimized-Kalman-Filter 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for Optimized-Kalman-Filter 0.0.1
File Size Uploaded
Optimized Kalman Filter-0.0.1.tar.gz 16.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for Optimized-Kalman-Filter 0.0.1
File Interpreter ABI Platform
Optimized_Kalman_Filter-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 35.6 kB

Release files / Optimized Kalman Filter-0.0.1.tar.gz

Download URL Optimized Kalman Filter-0.0.1.tar.gz
Size 16.4 kB
Tags Source
SHA-256 checksum
How to use checksums
3be9fc591007fd79ae3204cfe1079ff953ec54ecf3b725c6782fe9461a8ce5f1
BLAKE2b-256 checksum
How to use checksums
36cda045fb0d6512ca8f9c7448eb7f1340b6ec6f4c426682cb7d8376e019cc08
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.5.0.1 requests/2.23.0 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.7.3

Release files / Optimized_Kalman_Filter-0.0.1-py3-none-any.whl

Download URL Optimized_Kalman_Filter-0.0.1-py3-none-any.whl
Size 19.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
86ecc963e681eaf05429f3f9ff9b5b6118130ec253126764307225149c0a2ab0
BLAKE2b-256 checksum
How to use checksums
22ca8948ddbaf0fab1a7525595c07bd76e4b51722fbf29cfc1a7526185e29e91
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.6.0 importlib_metadata/4.8.2 pkginfo/1.5.0.1 requests/2.23.0 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.7.3

Release history Release notifications | RSS feed

0.0.9

1 release file

0.0.8

1 release file

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page