Skip to main content

Sequential Monte Carlo in Python

Project description



Sequential Monte Carlo in python.


This package was developed to complement the following book:

An introduction to Sequential Monte Carlo

by Nicolas Chopin and Omiros Papaspiliopoulos.

It now also implements algorithms and methods introduced after the book was published, see below.


  • particle filtering: bootstrap filter, guided filter, APF.

  • resampling: multinomial, residual, stratified, systematic and SSP.

  • possibility to define state-space models using some (basic) form of probabilistic programming; see below for an example.

  • SQMC (Sequential quasi Monte Carlo); routines for computing the Hilbert curve, and generating RQMC sequences.

  • FFBS (forward filtering backward sampling): standard, O(N^2) variant, and faster variants based on either MCMC, pure rejection, or the hybrid scheme; see Dau & Chopin (2022) for a discussion. The QMC version of Gerber and Chopin (2017, Bernoulli) is also implemented.

  • other smoothing algorithms: fixed-lag smoothing, on-line smoothing, two-filter smoothing (O(N) and O(N^2) variants).

  • Exact filtering/smoothing algorithms: Kalman (for linear Gaussian models) and forward-backward recursions (for finite hidden Markov models).

  • Standard and waste-free SMC samplers: SMC tempering, IBIS (a.k.a. data tempering). SMC samplers for binary words (Schäfer and Chopin, 2014), with application to variable selection.

  • Bayesian parameter inference for state-space models: PMCMC (PMMH, Particle Gibbs) and SMC^2.

  • Basic support for parallel computation (i.e. running multiple SMC algorithms on different CPU cores).

  • Variance estimators (Chan and Lai, 2013 ; Lee and Whiteley, 2018; Olsson and Douc, 2019).

  • nested sampling: both the vanilla version and the SMC sampler of Salomone et al (2018).


Here is how you may define a parametric state-space model:

import particles
import particles.state_space_models as ssm
import particles.distributions as dists

class ToySSM(ssm.StateSpaceModel):
    def PX0(self):  # Distribution of X_0 
        return dists.Normal()  # X_0 ~ N(0, 1)
    def PX(self, t, xp):  # Distribution of X_t given X_{t-1}
        return dists.Normal(loc=xp)  # X_t ~ N( X_{t-1}, 1)
    def PY(self, t, xp, x):  # Distribution of Y_t given X_t (and X_{t-1}) 
        return dists.Normal(loc=x, scale=self.sigma)  # Y_t ~ N(X_t, sigma^2)

You may now choose a particular model within this class, and simulate data from it:

my_model = ToySSM(sigma=0.2)
x, y = my_model.simulate(200)  # sample size is 200

To run a bootstrap particle filter for this model and data y, simply do:

alg = particles.SMC(fk=ssm.Bootstrap(ssm=my_model, data=y), N=200)

That's it! Head to the documentation for more examples, explanations, and installation instructions.

Who do I talk to?

Nicolas Chopin ( is the main author, contributor, and person to blame if things do not work as expected.

Bug reports, feature requests, questions, rants, etc are welcome, preferably on the github page.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

particles-0.4-py3-none-any.whl (670.5 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page