A systematic resampler for sequential Monte Carlo.

The value returned from this function is similar to sampling with

expanded_sample_shape = tf.concat([[event_size], sample_shape]), axis=-1)
logits = dist_util.move_dimension(log_probs, source_idx=0, dest_idx=-1)

but with values sorted along the first axis. It can be considered to be sampling events made up of a length-event_size vector of draws from the Categorical distribution. However, although the elements of this event have the appropriate marginal distribution, they are not independent of each other. Instead they are drawn using a stratified sampling method that in some sense reduces variance and is suitable for use with Sequential Monte Carlo algorithms as described in [Doucet et al. (2011)][2]. The sortedness is an unintended side effect of the algorithm that is harmless in the context of simple SMC algorithms.

This implementation is based on the algorithms in [Maskell et al. (2006)][1] where it is called minimum variance resampling.

log_probs A tensor-valued batch of discrete log probability distributions. It is expected that those log probabilities are normalized along the first dimension (such that sum(exp(log_probs), axis=0) == 1). The remaining dimensions are batch dimensions.
event_size the dimension of the vector considered a single draw.
sample_shape the sample_shape determining the number of draws.
seed PRNG seed; see tfp.random.sanitize_seed for details. Default value: None (i.e. no seed).
name Python str name for ops created by this method. Default value: None (i.e., 'resample_systematic').

resampled_indices a tensor of samples.


[1]: S. Maskell, B. Alun-Jones and M. Macleod. A Single Instruction Multiple Data Particle Filter. In 2006 IEEE Nonlinear Statistical Signal Processing Workshop. [2]: A. Doucet & A. M. Johansen. Tutorial on Particle Filtering and Smoothing: Fifteen Years Later In 2011 The Oxford Handbook of Nonlinear Filtering