Skip to content

TuringLang/SliceSampling.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.