SliceSampling.jl

Slice sampling algorithms in Julia
Author TuringLang
Popularity
5 Stars
Updated Last
4 Months Ago
Started In
November 2023

Slice Sampling Algorithms in Julia

Stable Dev Build Status Coverage

This package implements slice sampling algorithms accessible through the AbstractMCMC interface. For general usage, please refer to here.

Implemented Algorithms

Univariate Slice Sampling Algorithms

  • Univariate slice sampling (Slice) algorithms by R. Neal 1:
    • Fixed window (Slice)
    • stepping-out window adaptation (SliceSteppingOut)
    • doubling-out window adaptation (SliceDoublingOut)

Meta Multivariate Samplers for Augmenting Univariate Samplers

  • Random permutation coordinate-wise Gibbs sampling2 (RandPermGibbs)
  • Hit-and-run sampling3 (HitAndRun)

Multivariate Slice Sampling Algorithms

  • Latent slice sampling (LSS) by Li and Walker4 (LatentSlice)
  • Gibbsian polar slice sampling (GPSS) by P. Schär, M. Habeck, and D. Rudolf5 (GibbsPolarSlice)

Example with Turing Models

This package supports the Turing probabilistic programming framework:

using Distributions
using Turing
using SliceSampling

@model function demo()
    s ~ InverseGamma(3, 3)
    m ~ Normal(0, sqrt(s))
end

sampler   = RandPermGibbs(SliceSteppingOut(2.))
n_samples = 10000
model     = demo()
sample(model, externalsampler(sampler), n_samples)

The following slice samplers can also be used as a conditional sampler in Turing.Experimental.Gibbs sampler:

  • For multidimensional variables:
    • RandPermGibbs
    • HitAndRun
  • For unidimensional variables:
    • Slice
    • SliceSteppingOut
    • SliceDoublingOut

See the following example:

using Distributions
using Turing
using SliceSampling

@model function simple_choice(xs)
    p ~ Beta(2, 2)
    z ~ Bernoulli(p)
    for i in 1:length(xs)
        if z == 1
            xs[i] ~ Normal(0, 1)
        else
            xs[i] ~ Normal(2, 1)
        end
    end
end

sampler = Turing.Experimental.Gibbs(
    (
        p = externalsampler(SliceSteppingOut(2.0)),
        z = PG(20, :z)
    )
)

n_samples = 1000
model     = simple_choice([1.5, 2.0, 0.3])
sample(model, sampler, n_samples)

Footnotes

  1. Neal, R. M. (2003). Slice sampling. The annals of statistics, 31(3), 705-767.

  2. Geman, S., & Geman, D. (1984). Stochastic relaxation, Gibbs distributions, and the Bayesian restoration of images. IEEE Transactions on Pattern Analysis and Machine Intelligence, (6).

  3. Bélisle, C. J., Romeijn, H. E., & Smith, R. L. (1993). Hit-and-run algorithms for generating multivariate distributions. Mathematics of Operations Research, 18(2), 255-266.

  4. Li, Y., & Walker, S. G. (2023). A latent slice sampling algorithm. Computational Statistics & Data Analysis, 179, 107652.

  5. Schär, P., Habeck, M., & Rudolf, D. (2023, July). Gibbsian polar slice sampling. In International Conference on Machine Learning.