Ensemble Kalman Filter
The EnKF treats the filtering distribution as Gaussian, but represents it with an ensemble of \(N\) members \(x^{(i)}\) instead of storing a mean and covariance and linearizing \(f\) or \(h\). The implied mean and covariance are the usual sample mean and sample covariance of the members.
Predict. Each member is advanced with the dynamics and process noise. Multiplicative inflation (optional) rescales deviations from the new ensemble mean by a factor \((1+\delta)\) to combat underspread ensembles.
Update. From deviations in state and observation space, form empirical cross-covariance \(C_{xy}\) and innovation covariance \(S\) in observation space (including observation noise). The Kalman gain \(K \approx C_{xy} S^{-1}\) gives a Kalman-like correction to each member (e.g. stochastic EnKF with random observation perturbations).
The EnKF allows for storing its predicted states, \(x_{t \mid t - 1}\), through the store_predicted_ensemble flag. This flag is required when the filtering outputs are to be used by an EnRTS smoother.
See Algorithm 2 in Appendix A in Calvello, Reich, and Stuart., Ensemble Kalman Methods: A Mean Field Perspective for the EnKF algorithm which accomodates non-linear observation functions \(h\). Note that this algorithm corresponds to the perturbed_obs = True (Default) option in the EnKF implementation. This boolean flag is represented by s in Algorithm 10.2 of Sanz-Alonso et al., Inverse Problems and Data Assimilation, which was only written for linear \(h\).
cuthbert.ensemble_kalman.ensemble_kalman_filter
Implements the high-level Ensemble Kalman Filter (EnKF).
See Algorithm 10.2, Sanz-Alonso et al., Inverse Problems and Data Assimilation. Based in part on the CD-Dynamax implementation.
EnKFState
Bases: NamedTuple
Ensemble Kalman filter state.
key
instance-attribute
ensemble
instance-attribute
model_inputs
instance-attribute
log_normalizing_constant
instance-attribute
predicted_ensemble = None
class-attribute
instance-attribute
n_particles
property
Number of particles.
mean
property
Ensemble mean.
chol_cov
property
Generalised Cholesky factor of the ensemble sample covariance.
build_filter(init_sample, get_dynamics, get_observations, n_particles, inflation=0.0, perturbed_obs=True, store_predicted_ensemble=False)
Builds an Ensemble Kalman Filter object.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
init_sample
|
InitSample
|
Function to sample from the initial distribution from key and model inputs. |
required |
get_dynamics
|
GetEnKFDynamics
|
Function to get dynamics function (x_t, key) -> x_{t+1} ~ p(x_{t+1} | x_t) from model inputs. |
required |
get_observations
|
GetEnKFObservations
|
Function to get observation function, chol_R, and y from model inputs. |
required |
n_particles
|
int
|
Number of particles. |
required |
inflation
|
float
|
Multiplicative inflation factor for ensemble deviations. |
0.0
|
perturbed_obs
|
bool
|
If True, use perturbed observations (stochastic EnKF). |
True
|
store_predicted_ensemble
|
bool
|
Whether to store the incoming forecast ensemble in each filter state, as required by the EnRTS smoother. |
False
|
Returns:
| Type | Description |
|---|---|
Filter
|
Filter object for the EnKF. |
Raises:
| Type | Description |
|---|---|
ValueError
|
If |
Source code in cuthbert/ensemble_kalman/ensemble_kalman_filter.py
init_prepare(model_inputs, init_sample, n_particles, store_predicted_ensemble=False, key=None)
Prepare the initial state for the EnKF.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
model_inputs
|
ArrayTreeLike
|
Model inputs. |
required |
init_sample
|
InitSample
|
Function to sample from the initial distribution from key and model inputs. |
required |
n_particles
|
int
|
Number of particles. |
required |
store_predicted_ensemble
|
bool
|
Whether to store incoming forecast ensembles. |
False
|
key
|
KeyArray | None
|
JAX random key. |
None
|
Returns:
| Type | Description |
|---|---|
EnKFState
|
Initial EnKF state. |
Raises:
| Type | Description |
|---|---|
ValueError
|
If key is None. |
Source code in cuthbert/ensemble_kalman/ensemble_kalman_filter.py
filter_prepare(model_inputs, init_sample, n_particles, store_predicted_ensemble=False, key=None)
Prepare a state for an EnKF step.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
model_inputs
|
ArrayTreeLike
|
Model inputs. |
required |
init_sample
|
InitSample
|
Function to sample from the initial distribution from key and model inputs. |
required |
n_particles
|
int
|
Number of particles. |
required |
store_predicted_ensemble
|
bool
|
Whether to store incoming forecast ensembles. |
False
|
key
|
KeyArray | None
|
JAX random key. |
None
|
Returns:
| Type | Description |
|---|---|
EnKFState
|
Prepared EnKF state with dummy ensemble. |
Raises:
| Type | Description |
|---|---|
ValueError
|
If key is None. |
Source code in cuthbert/ensemble_kalman/ensemble_kalman_filter.py
filter_combine(state_1, state_2, get_dynamics, get_observations, inflation=0.0, perturbed_obs=True, store_predicted_ensemble=False)
Combine previous EnKF state with prepared state for current step.
Implements the EnKF predict + update cycle.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
state_1
|
EnKFState
|
EnKF state from the previous time step. |
required |
state_2
|
EnKFState
|
EnKF state prepared for the current step. |
required |
get_dynamics
|
GetEnKFDynamics
|
Function to get dynamics function and chol_Q from model inputs. |
required |
get_observations
|
GetEnKFObservations
|
Function to get observation function, chol_R, and y from model inputs. |
required |
inflation
|
float
|
Multiplicative inflation factor. |
0.0
|
perturbed_obs
|
bool
|
If True, use perturbed observations. |
True
|
store_predicted_ensemble
|
bool
|
Whether to store the incoming forecast ensemble. |
False
|
Returns:
| Type | Description |
|---|---|
EnKFState
|
Updated EnKF state. |