# slicesample
Metropolis-Hastings 样本
函数库: TyStatistics
# 语法
rnd, neval = slicesample(rng::AbstractRNG,initial,nsamples;pdf::Union{Nothing,Function}=nothing,logpdf::Union{Nothing,Function}=nothing,burnin=0,thin=1,width=10)
# 描述
rnd, neval = slicesample(rng,initial,nsamples;pdf=nothing,logpdf=nothing,burnin=0,thin=1,width=10)使用切片采样方法生成 nsamples 随机样本和切片采样中发生的函数计算的平均次数,pdf默认为nothing 给出目标概率密度函数 (pdf)。 初始是包含随机样本序列初始值的行向量或标量,logpdf默认为nothing使用 pdf 的对数生成样本。
# 示例
从多峰密度生成随机样本
此示例演示如何使用切片样本从多峰密度生成随机样本。
定义与多峰密度成比例的函数。
using TyMath
using TyStatistics
using TyPlot
rng = MT19937ar(5489) # For reproducibility
f_slice(x) = @. exp(-x^2/2)*(1 + (sin(3*x))^2)*(1 + (cos(5*x)^2));
area, = integral(f_slice, -5, 5);
根据密度生成 2000 个样本,使用 1000 个老化周期,并保留五分之一的样本。
N = 2000;
x, = slicesample(rng, 1, N, pdf=f_slice, thin=5, burnin=1000);
绘制样本的直方图。
binheight,bincenter = hist(x,50,fig = false);
h = bar(bincenter,binheight,facecolor = [0.8,0.8,1]);
缩放密度以使其具有与直方图相同的面积,并将其叠加在直方图上。
hold("on")
xd = [-4,4];
xgrid = LinRange(xd[1],xd[2],1000);
binwidth = (bincenter[2]-bincenter[1]);
y = (N*binwidth/area) * f_slice.(xgrid);
plot(xgrid,y,"r",linewidth = 2)
hold("off")
这些样本似乎很好地符合理论分布,因此老化值似乎足够。
# 输入参数
| 输入参数 | 含义 |
|---|---|
| rng | 随机数种子,如果不设置的话则使用全局随机数种子 |
| initial | 初始点、标量或行向量。 设置初始值,使 pdf(initial) 成为严格的正标量。 length(initial) 是每个样本的维数。 |
| nsamples | 正整数,切片样本生成的样本数。 |
# 关键字参数
| 关键字参数 | 含义 |
|---|---|
| 目标概率密度函数,默认值:nothing | |
| logpdf | pdf 的对数生成样本,默认值:nothing |
| burnin | 非负整数,在生成要返回的样本之前要生成和丢弃的样本数。切片采样算法是一个马尔可夫链,其平稳分布与 pdf 参数的平稳分布成正比。将老化设置为足够高的值,使您相信马尔可夫链在燃烧样本后大致达到平稳状态。默认值:0 |
| thin | 正整数,其中 slicesample 丢弃每个 slim-1 样本并返回下一个样本。切片采样算法是马尔可夫链,因此样本是串行相关的。为了减少序列相关性,请选择较大的thin值。默认值:1 |
| width | 当前样本周围间隔的宽度,正值的标量或向量。 slicesample 从此区间开始,搜索包含 pdf 计算结果足够大值的点的适当区域。如果 width 是标量并且样本具有多个维度,则 slicesample 对每个维度使用宽度。如果宽度是一个向量,它的长度应该与初始长度相同。默认值:10 |
# 输出参数
| 输出参数 | 含义 |
|---|---|
| rnd | nsamples-by-length(initial) 矩阵,其中每一行都是一个样本。 |
| neval | 标量,每个样本的函数评估的平均数量。 Navy包括burnin和thin评估,而不仅仅是rnd中返回的样本的评估。因此函数评估的总数为neval*(nsamples*thin + burnin). |
# 提示
- 对于为老化、薄度或宽度选择合适的值,没有明确的建议。选择老化和稀疏的起始值,并在必要时增加它们,以获得必要的独立性和边际分布。有关调整宽度的效果的详细信息,请参阅 Neal 1。
# 算法
在随机样本序列中的每个点,slicesample 通过“切片”密度来选择下一个点,以在密度高于某个值的前一个点周围形成邻域。因此,样本点不是独立的。序列中的邻近点往往比独立值样本中的点更靠近。出于许多目的,整个点集可以用作目标分布的样本。然而,当这种类型的串行相关性出现问题时,老化和精简参数可以帮助减少这种相关性。
slicesample 使用 Neal 1 的切片采样算法。为了数值稳定性,它将 pdf 函数转换为 logpdf 函数。 Neal 提出了调整每个级别的支持区域大小的算法,称为“步出”和“步入”。
# 参考
[1] Neal, Radford M. "Slice Sampling." Ann. Stat. Vol. 31, No. 3, pp. 705–767, 2003. Available at Project Euclid.