Main Content

slicesample

スライス サンプラー

構文

rnd = slicesample(initial,nsamples,'pdf',pdf)
rnd = slicesample(initial,nsamples,'logpdf',logpdf)
[rnd,neval] = slicesample(initial,...)
[rnd,neval] = slicesample(initial,...,Name,Value)

説明

rnd = slicesample(initial,nsamples,'pdf',pdf) はスライス サンプリング法を使用して nsamples 無作為標本を生成します (アルゴリズムを参照)。pdf はターゲットの確率密度関数 (pdf) を指定します。initial は無作為標本列の初期値を含む行ベクトルまたはスカラーです。

rnd = slicesample(initial,nsamples,'logpdf',logpdf) は pdf の対数を使用して、標本を生成します。

[rnd,neval] = slicesample(initial,...) は、スライス サンプリングで行った関数評価の平均回数を返します。

[rnd,neval] = slicesample(initial,...,Name,Value) は、1 つまたは複数の Name,Value のペア引数で指定された追加オプションを使用して、ランダムな標本を生成します。

入力引数

initial

初期点、スカラーまたは行ベクトル。pdf(initial) が厳密に正のスカラーになるように initial を設定します。length(initial) は各標本の次元数です。

nsamples

正の整数、slicesample が生成する標本の数。

pdf

@ で指定された確率密度関数を生成する関数のハンドル。pdf は非正規化が可能なので、積分して 1 になる必要がないことを意味します。

logpdf

@ で指定された確率密度関数の対数を生成する関数のハンドル。logpdf は正規化されていない pdf の対数にすることができます。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。

R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

burnin

非負整数。返す標本を生成する前に生成および破棄する標本の数。Slice Sampling アルゴリズムは、定常分布が pdf 引数の定常分布に比例するマルコフ連鎖です。burnin を、マルコフ連鎖が burnin 標本後におおよそ達すると思われる定常性を示す十分に高い値に設定します。

既定値: 0

thin

正の整数。slicesamplethin - 1 個の標本をすべて破棄して次を返します。Slice Sampling アルゴリズムはマルコフ連鎖であるため、標本には系列相関があります。系列相関を減らすには、より大きい値の thin を選択します。

既定値: 1

width

現在の標本の周囲にある間隔の幅で、正の値のスカラーまたはベクトル。関数 slicesample はこの間隔から開始して、十分に大きな値で評価する pdf の点を含む適切な領域を検索します。

  • width がスカラー値で、標本に複数の次元がある場合、slicesample は次元ごとに width を使用します。

  • width がベクトルの場合は、initial と同じ長さでなければなりません。

既定値: 10

出力引数

rnd

nsampleslength(initial) 列の行列で、各行が 1 つの標本です。

neval

スカラー、標本ごとの関数評価の平均数。neval は、rnd に返される標本の評価だけでなく、 burninthin の評価を含みます。したがって、関数評価の合計回数は以下のとおりです。

neval*(nsamples*thin + burnin)

すべて折りたたむ

この例では、slicesample を使用してマルチモーダル密度から無作為な標本を生成する方法を説明します。

マルチモーダル密度に比例する関数を定義します。

rng default  % For reproducibility
f = @(x) exp(-x.^2/2).*(1 + (sin(3*x)).^2).*...
    (1 + (cos(5*x).^2));
area = integral(f,-5,5);

バーンイン期間 1000 を使用し、5 標本あたり 1 標本を保持して、密度から 2000 標本を生成します。

N = 2000;
x = slicesample(1,N,'pdf',f,'thin',5,'burnin',1000);

標本のヒストグラムをプロットします。

[binheight,bincenter] = hist(x,50);
h = bar(bincenter,binheight,'hist');
h.FaceColor = [.8 .8 1];

Figure contains an axes object. The axes object contains an object of type patch.

ヒストグラムと同じ領域をもつように密度をスケーリングして、ヒストグラムに重ね合わせます。

hold on
h = gca;
xd = h.XLim;
xgrid = linspace(xd(1),xd(2),1000);
binwidth = (bincenter(2)-bincenter(1));
y = (N*binwidth/area) * f(xgrid);
plot(xgrid,y,'r','LineWidth',2)
hold off

Figure contains an axes object. The axes object contains 2 objects of type patch, line.

標本が理論上の分布に十分に近似しているように見えれば、burnin 値は適切と考えられます。

ヒント

  • burninthin、または width の適切な値を選択するための明確な推奨手順はありません。burninthin の開始値を選択し、必要に応じてそれらを増加させて、必要な独立性と周辺分布を指定します。width の調整の効果について詳しくは、Neal の[1]を参照してください。

アルゴリズム

無作為標本列の各点で、slicesample は密度を "スライス" して次の点を選択し、密度がある値より上にある前の点の近傍を形成します。その結果、標本点は独立でなくなります。列内の近接点は、独立した値の標本からよりも互いに接近している傾向があります。多くの目的で、点のセット全体を対象の分布からの標本として使用できます。ただし、この種の系列相関が問題となる場合、burnin パラメーターと thin パラメーターを使用して、この相関を減らすことができます。

slicesample では、Neal の Slice Sampling アルゴリズム ([1]) を使用しています。このアルゴリズムでは、数値の安定性のために、関数 pdf を関数 logpdf に変換します。各レベルのサポート領域のサイズを変更する、"ステップ イン"、"ステップ アウト" と呼ばれるアルゴリズムが、Neal によって提唱されました。

参考文献

[1] Neal, Radford M. "Slice Sampling." Ann. Stat. Vol. 31, No. 3, pp. 705–767, 2003. Available at Project Euclid.

バージョン履歴

R2006a で導入