High-Performance Kalman Filtering and Smoothing
Project description
kalmantv: High-Performance Kalman Filtering and Smoothing in Python
Mohan Wu, Martin Lysy
Description
kalmantv provides a simple Python interface to the time-varying Kalman filtering and smoothing algorithms. Various low-level backends are provided in the following modules:
-
kalmantv.cython
: This module performs the underlying linear algebra using the BLAS/LAPACK routines provided by NumPy through a Cython interface. To maximize speed, no input checks are provided. All inputs must befloat64
NumPy arrays in Fortran order. -
kalmantv.eigen
: This module uses the C++ Eigen library for linear algebra. The interface is also through Cython. Here again we have the same input requirements and lack of checks. Eigen is known to be faster than most BLAS/LAPACK implementations, but it needs to be compiled properly to achieve maximum performance. In particular this involves linking against an installed version of Eigen (not provided) and setting the right compiler flags for SIMD and OpenMP support. Some defaults are provided insetup.py
, but tweaks may be required depending on the user's system. -
kalmantv.numba
: This module once again uses BLAS/LAPACK but the interface is through Numba. Here input checks are performed and the inputs can be in either C or Fortran order, and single or double precision (float32
andfloat64
). However, C ordered arrays are first converted to Fortran order, so the latter is preferable for performance considerations.
Installation
git clone https://github.com/mlysy/kalmantv
cd kalmantv
pip install .
Unit Testing
The unit tests are done against the pykalman library to ensure the same results. From inside the root folder of the kalmantv source code:
pip install .[tests]
cd tests
python -m unittest discover -v
Documentation
The HTML documentation can be compiled from the kalmantv root folder:
pip install .[docs]
cd docs
make html
This will create the documentation in docs/build
.
Usage
The usage of the library can be demonstrated through this simple example. Here we use the KalmanTV
class from the kalmantv.cython
module. The same class is defined in kalmantv.eigen
and kalmantv.numba
with exactly the same methods and signatures.
Suppose we start with given mean and variance of the priror, mu_state_past
and var_state_past
, our goal is to compute mu_state_filt
and var_state_filt
at the next time step. We define mu_state_pred
and var_state_pred
for the prediction step in the Kalman filtering algorithm. More details can be found in the documentation.
import numpy as np
from kalmantv.cython import KalmanTV
n_meas = 2 # Set the size of the measurement
n_state = 4 # Set the size of the state
# Set initial mu and var of the prior
mu_state_past = np.random.rand(n_state)
var_state_past = np.random.rand(n_state, n_state)
var_state_past = var_state_past.dot(var_state_past.T) #Ensure positive semidefinite
var_state_past = np.asfortranarray(var_state_past) # must use Fortran order
# Parameters to the Kalman Filter
mu_state = np.random.rand(n_state)
wgt_state = np.random.rand(n_state, n_state).T # converts to Fortran order
var_state = np.random.rand(n_state, n_state)
var_state = var_state.dot(var_state.T).T
x_meas = np.random.rand(n_meas)
mu_meas = np.random.rand(n_meas)
wgt_meas = np.random.rand(n_state, n_meas).T
var_meas = np.random.rand(n_meas, n_meas)
var_meas = var_meas.dot(var_meas.T).T
# Initialize the KalmanTV class
ktv = KalmanTV(n_meas, n_state)
# Allocate memory for storing the output
mu_state_pred = np.empty(n_state)
var_state_pred = np.empty((n_state, n_state), order='F')
mu_state_filt = np.empty(n_state)
var_state_filt = np.empty((n_state, n_state), order='F')
# Run the filtering algorithm
ktv.filter(mu_state_pred, var_state_pred,
mu_state_filt, var_state_filt,
mu_state_past, var_state_past,
mu_state, wgt_state, var_state,
x_meas, mu_meas, wgt_meas, var_meas)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file kalmantv-0.2.1.tar.gz
.
File metadata
- Download URL: kalmantv-0.2.1.tar.gz
- Upload date:
- Size: 24.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.5.0.1 requests/2.21.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a7299741c116c1154f485c2812e988af6a426608d32ca77dd7a6b864726f6944 |
|
MD5 | 9322dbcb2db3413d37d7191b7ab5cbd0 |
|
BLAKE2b-256 | c31384292bb3fc818d04f91eca6d4697530685b1c0ad8edd570b0c20a8d4a4a9 |
File details
Details for the file kalmantv-0.2.1-cp37-cp37m-win_amd64.whl
.
File metadata
- Download URL: kalmantv-0.2.1-cp37-cp37m-win_amd64.whl
- Upload date:
- Size: 298.5 kB
- Tags: CPython 3.7m, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.5.0 importlib_metadata/4.8.1 pkginfo/1.5.0.1 requests/2.21.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.7.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a597e46a2c19aede749b5fc6919dbf6357fdfa9483eeaf5da4c1fd2e0ef96792 |
|
MD5 | 7efc05ee5b537c10f57025b5f7964ba3 |
|
BLAKE2b-256 | 1009cdd49d359297db0c3b53d223ade2a2e386e267fa79dd556ac5ecab3e75dd |