slicesample
statistics: [smpl, neval] = slicesample (start, nsamples, property, value, …)
Draws nsamples samples from a target stationary distribution pdf using slice sampling of Radford M. Neal.
Input:
Next, several property-value pairs can or must be specified, they are:
(Required properties) One of:
or
The following input property/pair values may be needed depending on the desired output:
Outputs:
Example : Sampling from a normal distribution
start = 1; nsamples = 1e3; pdf = @(x) exp (-.5 * x .^ 2) / (pi ^ .5 * 2 ^ .5); [smpl, accept] = slicesample (start, nsamples, "pdf", pdf, "thin", 4); histfit (smpl); |
See also: rand, mhsample, randsample
Source Code: slicesample
Define function to sample
d = 2;
mu = [-1; 2];
rand ('seed', 5) # for reproducibility
Sigma = rand (d);
Sigma = (Sigma + Sigma');
Sigma += eye (d)*abs (eigs (Sigma, 1, 'sa')) * 1.1;
pdf = @(x)(2*pi)^(-d/2)*det (Sigma)^-.5*exp (-.5*sum ((x.'-mu).*(Sigma\(x.'-mu)),1));
Inputs
start = ones (1,2);
nsamples = 500;
K = 500;
m = 10;
rande ('seed', 4); rand ('seed', 5) # for reproducibility
[smpl, accept] = slicesample (start, nsamples, 'pdf', pdf, 'burnin', K, 'thin', m, 'width', [20, 30]);
figure;
hold on;
plot (smpl(:,1), smpl(:,2), 'x');
[x, y] = meshgrid (linspace (-6,4), linspace (-3,7));
z = reshape (pdf ([x(:), y(:)]), size (x));
mesh (x, y, z, 'facecolor', 'None');
Using sample points to find the volume of half a sphere with radius of .5
f = @(x) ((.25-(x(:,1)+1).^2-(x(:,2)-2).^2).^.5.*(((x(:,1)+1).^2+(x(:,2)-2).^2)<.25)).';
int = mean (f(smpl) ./ pdf (smpl));
errest = std (f(smpl) ./ pdf (smpl)) / nsamples^.5;
trueerr = abs (2/3*pi*.25^(3/2)-int);
fprintf ("Monte Carlo integral estimate int f(x) dx = %f\n", int);
Monte Carlo integral estimate int f(x) dx = 0.228408
fprintf ("Monte Carlo integral error estimate %f\n", errest);
Monte Carlo integral error estimate 0.029831
fprintf ("The actual error %f\n", trueerr);
The actual error 0.033392
mesh (x,y,reshape (f([x(:), y(:)]), size (x)), 'facecolor', 'None');
Integrate truncated normal distribution to find normalization constant
pdf = @(x) exp (-.5*x.^2)/(pi^.5*2^.5);
nsamples = 1e3;
rande ('seed', 4); rand ('seed', 5) # for reproducibility
[smpl, accept] = slicesample (1, nsamples, 'pdf', pdf, 'thin', 4);
f = @(x) exp (-.5 * x .^ 2) .* (x >= -2 & x <= 2);
x = linspace (-3, 3, 1000);
area (x, f(x));
xlabel ('x');
ylabel ('f(x)');
int = mean (f(smpl) ./ pdf (smpl));
errest = std (f(smpl) ./ pdf (smpl)) / nsamples ^ 0.5;
trueerr = abs (erf (2 ^ 0.5) * 2 ^ 0.5 * pi ^ 0.5 - int);
fprintf ("Monte Carlo integral estimate int f(x) dx = %f\n", int);
Monte Carlo integral estimate int f(x) dx = 2.376284
fprintf ("Monte Carlo integral error estimate %f\n", errest);
Monte Carlo integral error estimate 0.017608
fprintf ("The actual error %f\n", trueerr);
The actual error 0.016292