Kalman filtering and smoothing for larger-than-memory datasets
Project description
largekalman
Kalman filtering and smoothing for larger-than-memory datasets.
Features
- Memory-efficient: Processes data in batches, writing intermediate results to disk
- RTS Smoother: Full Rauch-Tung-Striebel smoothing with lag-1 covariance
- Sufficient statistics: Returns statistics needed for EM parameter estimation
- Non-square observation matrices: Supports observation dimension different from latent dimension
Installation
pip install largekalman
Requirements: A C compiler (gcc) is needed to build the native extension.
- Ubuntu/Debian:
sudo apt install build-essential - macOS:
xcode-select --install - Fedora:
sudo dnf install gcc
Quick Start
import largekalman
# Define state space model parameters
F = [[0.9, 0.1], [0.0, 0.9]] # Transition matrix
Q = [[0.1, 0.0], [0.0, 0.1]] # Process noise covariance
H = [[1.0, 0.0], [0.0, 1.0]] # Observation matrix
R = [[0.5, 0.0], [0.0, 0.5]] # Observation noise covariance
# Observations as an iterator (can be a generator for large datasets)
observations = [[1.2, 0.8], [1.5, 1.1], [1.8, 1.3], ...]
# Run the smoother
generator, stats = largekalman.smooth(
'tmp_folder', # Temporary folder for intermediate files
F, Q, H, R,
iter(observations),
store_observations=False # Don't keep observations in memory
)
# Iterate over smoothed estimates
for mu, cov, lag1_cov in generator:
print(f"Smoothed mean: {mu}")
print(f"Smoothed covariance: {cov}")
print(f"Lag-1 covariance: {lag1_cov}")
# Sufficient statistics for EM
print(f"Number of datapoints: {stats['num_datapoints']}")
print(f"Sum of latent means: {stats['latents_mu_sum']}")
print(f"Sum of E[x_t x_t^T]: {stats['latents_cov_sum']}")
print(f"Sum of E[x_{t+1} x_t^T]: {stats['latents_cov_lag1_sum']}")
API Reference
smooth(tmp_folder, F, Q, H, R, observations_iter, store_observations=True, batch_size=10000)
Run Kalman filter forward pass followed by RTS smoother backward pass.
Parameters:
tmp_folder: Path to folder for temporary files (created if doesn't exist)F: Transition matrix (n_latents x n_latents)Q: Process noise covariance (n_latents x n_latents)H: Observation matrix (n_obs x n_latents)R: Observation noise covariance (n_obs x n_obs)observations_iter: Iterator over observation vectorsstore_observations: If False, delete observations file after processingbatch_size: Number of timesteps to process at once
Returns:
generator: Yields(mu, cov, lag1_cov)tuples for each timestepstats: Dictionary of sufficient statistics
Sufficient Statistics
The stats dictionary contains:
num_datapoints: Number of observations processedlatents_mu_sum: Sum of smoothed meanslatents_cov_sum: Sum of E[x_t x_t^T] (includes outer product of means)latents_cov_lag1_sum: Sum of E[x_{t+1} x_t^T] for consecutive pairsobs_sum: Sum of observationsobs_obs_sum: Sum of E[y_t y_t^T]obs_latents_sum: Sum of E[y_t x_t^T]
EM Parameter Estimation
Use the built-in em function to learn model parameters from data:
import largekalman
# Fit parameters using EM (H fixed by default for identifiability)
params, history = largekalman.em(
'tmp_folder',
observations,
n_latents=2,
n_iters=20,
verbose=True
)
print(f"Fitted F:\n{params['F']}")
print(f"Fitted Q:\n{params['Q']}")
print(f"Fitted R:\n{params['R']}")
# Fix multiple parameters
params, _ = largekalman.em('tmp', obs, n_latents=2, fixed='HR')
em(tmp_folder, observations, n_latents, n_obs=None, n_iters=20, init_params=None, fixed='H', verbose=False)
Fit Kalman filter parameters using Expectation-Maximization.
Parameters:
tmp_folder: Path to folder for temporary filesobservations: List of observation vectorsn_latents: Number of latent dimensionsn_obs: Number of observation dimensions (inferred from data if None)n_iters: Number of EM iterationsinit_params: Optional dict with initial parameters{'F', 'Q', 'H', 'R'}fixed: String of parameters to hold fixed, e.g.'H'or'HR'. Required for identifiability.verbose: Print progress if True
Returns:
params: Dict with fitted parameters{'F', 'Q', 'H', 'R'}history: List of parameter dicts from each iteration
em_step(tmp_folder, F, Q, H, R, observations)
Run a single EM iteration for custom control over the optimization.
Returns:
F_new, Q_new, H_new, R_new: Updated parameters as numpy arraysstats: Sufficient statistics from the E-step
License
MIT License
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file largekalman-0.2.1.tar.gz.
File metadata
- Download URL: largekalman-0.2.1.tar.gz
- Upload date:
- Size: 18.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9887ef3a1bae2e9edcc65957782945504872179abdc8d55144d915073c749210
|
|
| MD5 |
48417f497b5688c71cf0d0c0a22a1c68
|
|
| BLAKE2b-256 |
aa6914bd5bac35de09fe0344b6fb8ec451f0c62e5b3f91b9aed2e31839b680d9
|
File details
Details for the file largekalman-0.2.1-py3-none-any.whl.
File metadata
- Download URL: largekalman-0.2.1-py3-none-any.whl
- Upload date:
- Size: 14.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
77df9cdf973bd1379e1313003eb772a9150c6239a43773ff2be57f711c7e121b
|
|
| MD5 |
2cbc2475ae2796117ca11213221dd6f3
|
|
| BLAKE2b-256 |
cf99dd2b5ffcb7aae55c5327c5e64246d51dcdf43d0c445adc0bcbc03fd57ac9
|