# EnsembleKalmanProcesses

`EnsembleKalmanProcesses.jl`

(EKP) is a library of derivative-free Bayesian optimization techniques based on ensemble Kalman Filters, a well known family of approximate filters used for data assimilation. The tools in this library enable fitting parameters found in expensive black-box computer codes without the need for adjoints or derivatives. This property makes them particularly useful when calibrating non-deterministic models, or when the training data are noisy.

Currently, the following methods are implemented in the library:

- Ensemble Kalman Inversion (EKI) - The traditional optimization technique based on the (perturbed-observation-based) Ensemble Kalman Filter EnKF (Iglesias, Law, Stuart, 2013),
- Ensemble Transform Kalman Inversion (ETKI) - An optimization technique based on the (square-root-based) ensemble transform Kalman filter (Bishop et al., 2001, Huang et al., 2022 )
- Ensemble Kalman Sampler (EKS) - also obtains a Gaussian Approximation of the posterior distribution, through a Monte Carlo integration (Garbuno-Inigo, Hoffmann, Li, Stuart, 2020),
- Unscented Kalman Inversion (UKI) - also obtains a Gaussian Approximation of the posterior distribution, through a quadrature based integration approach (Huang, Schneider, Stuart, 2022),
- Sparsity-inducing Ensemble Kalman Inversion (SEKI) - Additionally adds approximate $L^0$ and $L^1$ penalization to the EKI (Schneider, Stuart, Wu, 2020).

Module | Purpose |
---|---|

EnsembleKalmanProcesses.jl | Collection of all tools |

EnsembleKalmanProcess.jl | Implementations of EKI, ETKI, EKS, UKI, and SEKI |

Observations.jl | Structure to hold observational data and minibatching |

ParameterDistributions.jl | Structures to hold prior and posterior distributions |

DataContainers.jl | Structure to hold model parameters and outputs |

Localizers.jl | Covariance localization kernels |

# Quick links!

- How do I build prior distributions?
- How do I build my observations and encode batching?
- What ensemble size should I take? Which process should I use? What is the recommended configuration?
- What is the difference between
`get_u`

and`get_ϕ`

? Why do the stored parameters apperar to be outside their bounds? - What can be parallelized? How do I do it in Julia?
- What is going on in my own code?
- What is this error/warning/message?
- Where can i walk through a simple example?

Learning the amplitude and vertical shift of a sine curve See full example for the code.

## Authors

`EnsembleKalmanProcesses.jl`

is being developed by the Climate Modeling Alliance. The main developers are Oliver R. A. Dunbar and Ignacio Lopez-Gomez.