Smoothers

class stonesoup.smoother.base.Smoother(transition_model: TransitionModel = None)[source]

Bases: stonesoup.base.Base

Smoother Base Class

(Fixed interval) Smoothers in general are used to infer a state, or series of states, \(\mathbf{x}_k\) from measurements \(\mathbf{z}_{1:K}\) where \(k < K\).

The calculation is forward-backward in nature. The forward algorithm is “standard” filtering, provided by other Stone Soup components. The Smoother’s input is therefore a Track (created by whatever means) The smooth() function undertakes the backward algorithm.

Parameters

transition_model (TransitionModel, optional) – Transition Model.

transition_model: stonesoup.models.transition.base.TransitionModel

Transition Model.

Kalman

class stonesoup.smoother.kalman.KalmanSmoother(transition_model: LinearGaussianTransitionModel)[source]

Bases: stonesoup.smoother.base.Smoother

The linear-Gaussian or Rauch-Tung-Striebel smoother, colloquially the Kalman smoother 1. The transition model is therefore linear-Gaussian. No control model is currently implemented.

TODO: Include a control model

The smooth function undertakes the backward algorithm on a Track() object. This is done by starting at the final index in the track, \(K\) and proceeding from \(K \rightarrow 1\) via:

\[ \begin{align}\begin{aligned}\mathbf{x}_{k|k-1} &= F_{k} \mathbf{x}_{k-1}\\P_{k|k-1} &= F_{k} P_{k-1} F_{k}^T + Q_{k}\\G_k &= P_{k-1} F_{k}^T P_{k|k-1}^{-1}\\\mathbf{x}_{k-1}^s &= \mathbf{x}_{k-1} + G_k (\mathbf{x}_{k}^s - \mathbf{x}_{k|k-1})\\P_{k-1}^s &= P_{k-1} + G_k (P_{k}^s - P_{k|k-1}) G_k^T\end{aligned}\end{align} \]

where \(\mathbf{x}_{K}^s = \mathbf{x}_{K}\) and \(P_K^s = P_K\).

The predicted state vector and covariance are retrieved from the Track via predicted state or updated state via the links therein. Note that this means that the first two equations are not calculated, the results merely retrieved. This smoother is therefore strictly Kalman only in the backward portion. The prediction might have come by any number of means. If present, the transition model (providing \(F\) and \(Q\)) in the prediction is used. This allows for a dynamic transition model (i.e. one that changes with \(k\)). Otherwise, the (static) transition model is used, defined on smoother initialisation.

References

1

Särkä S. 2013, Bayesian filtering and smoothing, Cambridge University Press

Parameters

transition_model (LinearGaussianTransitionModel) – The transition model. The smooth() function will initially look for a transition model in the prediction. If that is not found then this one is used.

transition_model: stonesoup.models.transition.linear.LinearGaussianTransitionModel

The transition model. The smooth() function will initially look for a transition model in the prediction. If that is not found then this one is used.

smooth(track)[source]

Perform the backward recursion to smooth the track.

Parameters

track (Track) – The input track.

Returns

Smoothed track

Return type

Track

class stonesoup.smoother.kalman.ExtendedKalmanSmoother(transition_model: TransitionModel)[source]

Bases: stonesoup.smoother.kalman.KalmanSmoother

The extended version of the Kalman smoother. The equations are modified slightly, analogously to the extended Kalman filter,

\[ \begin{align}\begin{aligned}\mathbf{x}_{k|k-1} &= f_{k} (\mathbf{x}_{k-1})\\F_k &\approx J_f (\mathbf{x}_{k-1})\end{aligned}\end{align} \]

where \(J_f (\mathbf{x}_{k-1})\) is the Jacobian matrix evaluated at \(\mathbf{x}_{k-1}\). The rest of the calculation proceeds as with the Kalman smoother.

In fact the first equation isn’t calculated – it’s presumed to have been undertaken by a filter when building the track; similarly for the predicted covariance. In practice, the only difference between this and the Kalman smoother is in the use of the linearised transition matrix to calculate the smoothing gain.

Parameters

transition_model (TransitionModel) – The transition model to be used.

transition_model: stonesoup.models.transition.base.TransitionModel

The transition model to be used.

class stonesoup.smoother.kalman.UnscentedKalmanSmoother(transition_model: TransitionModel, alpha: float = 0.5, beta: float = 2, kappa: float = 0)[source]

Bases: stonesoup.smoother.kalman.KalmanSmoother

The unscented version of the Kalman filter. As with the parent version of the Kalman smoother, the mean and covariance of the prediction are retrieved from the track. The unscented transform is used to calculate the smoothing gain.

Parameters
  • transition_model (TransitionModel) – The transition model to be used.

  • alpha (float, optional) – Primary sigma point spread scaling parameter. Default is 0.5.

  • beta (float, optional) – Used to incorporate prior knowledge of the distribution. If the true distribution is Gaussian, the value of 2 is optimal. Default is 2

  • kappa (float, optional) – Secondary spread scaling parameter. Default is calculated as 3-Ns

transition_model: stonesoup.models.transition.base.TransitionModel

The transition model to be used.

alpha: float

Primary sigma point spread scaling parameter. Default is 0.5.

beta: float

Used to incorporate prior knowledge of the distribution. If the true distribution is Gaussian, the value of 2 is optimal. Default is 2

kappa: float

Secondary spread scaling parameter. Default is calculated as 3-Ns