Main Content

HamiltonianSampler クラス

ハミルトニアン モンテカルロ (HMC) サンプラー

説明

ハミルトニアン モンテカルロ (HMC) サンプラーは、確率密度 P(x) からの標本生成に使用可能な、勾配ベースのマルコフ連鎖モンテカルロ サンプラーです。HMC サンプリングでは、log P(x) およびその勾配を指定する必要があります。

パラメーター ベクトル x は制約なしでなければなりません。つまり、x のどの要素も任意の実数をとり得ます。制約があるパラメーターをサンプリングするには、HMC サンプラーを使用する前に、このようなパラメーターを制約なしの変数に変換します。

サンプラーの作成後、このクラスのメソッドを使用して、MAP (最大事後確率) 点推定の計算、サンプラーの調整、標本の抽出、収束診断のチェックを行うことができます。このワークフローの例については、ハミルトニアン モンテカルロの使用によるベイズ線形回帰を参照してください。

構築

hmc = hmcSampler(logpdf,startpoint) は、ハミルトニアン モンテカルロ (HMC) サンプラーを作成し、HamiltonianSampler オブジェクトとして返します。logpdf は、平衡分布の確率密度の対数およびその勾配を評価する関数ハンドルです。列ベクトル startpoint は、HMC サンプリングを開始する初期点です。

hmc = hmcSampler(___,Name,Value) では、1 つ以上の名前と値のペアの引数を使用して追加オプションを指定します。名前と値のペアの引数は、他のすべての入力引数の後で指定します。

入力引数

すべて展開する

目標密度の対数とその勾配。関数ハンドルを指定します。

logpdf は、[lpdf,glpdf] = logpdf(X) である 2 つの出力引数を返さなければなりません。ここで、lpdf は e を底とする (最大で加算定数までの) 対数確率密度、glpdf は対数密度の勾配、点 Xstartpoint と同じ要素数の列ベクトルです。

logpdf の入力引数 X は制約なしでなければなりません。つまり、X のどの要素も任意の実数をとり得ます。HMC サンプラーの使用前に制約付きサンプリング パラメーターを制約なしの変数に変換してください。

'UseNumericalGradient' の値が true に設定された場合、logpdf は 2 番目の出力として勾配を返す必要はありません。数値勾配を使用する方が logpdf による勾配計算が不要になるため簡単になる可能性がありますが、サンプリング速度が落ちる場合もあります。

データ型: function_handle

サンプリングを開始する初期点。数値列ベクトルを指定します。

データ型: single | double

名前と値の引数

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

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

例: 'VariableNames',{'Intercept','Beta'},'MassVectorTuningMethod','hessian' は、サンプリング変数の名前と、質量ベクトルの調整法として 'hessian' を指定します。

ハミルトニアン ダイナミクスのステップ サイズ。'StepSize' と正のスカラーから構成されるコンマ区切りのペアとして指定します。

マルコフ連鎖の新しい状態を提案するため、HMC サンプラーはリープフロッグ法を使用してハミルトニアン ダイナミクスを積分します。この引数は、リープフロッグ法のステップ サイズを抑制します。

ステップ サイズは、tuneSampler を使用して自動的に調整できます。

例: 'StepSize',0.2

ハミルトニアン ダイナミクスのステップ数。'NumSteps' と正の整数から構成されるコンマ区切りのペアとして指定します。

マルコフ連鎖の新しい状態を提案するため、HMC サンプラーはリープフロッグ法を使用してハミルトニアン ダイナミクスを積分します。この引数は、リープフロッグ法のステップ数を抑制します。

ステップ数は、tuneSampler を使用して自動的に調整できます。

例: 'NumSteps',20

運動量変数の質量ベクトル。'MassVector' と、正の値をもち長さが startpoint に等しい数値列ベクトルから構成されるコンマ区切りのペアとして指定します。

目的の変数に関連する運動量変数の "質量" は、マルコフ連鎖の各提案でハミルトニアン ダイナミクスを抑制します。

質量ベクトルは、tuneSampler を使用して自動的に調整できます。

例: 'MassVector',rand(3,1)

ステップ サイズとステップ数の微変動方法。'JitterMethod' と次のいずれかから構成されるコンマ区切りのペアとして指定します。

説明
'jitter-both'

各リープフロッグ軌跡についてステップ サイズとステップ数をランダムに微変動させます。

'jitter-numsteps'

各リープフロッグ軌跡のステップ数のみを微変動させます。

'none'

微変動させません。

微変動させる場合、サンプラーは各リープフロッグ軌跡のステップ サイズまたはステップ数として 'StepSize' および 'NumSteps' の値より小さい値を無作為に選択します。微変動を使用すると、ハミルトニアン ダイナミクスに対するリープフロッグ法の安定性が向上します。

例: 'JitterMethod','jitter-both'

サンプラーのステップ サイズの調整方法。'StepSizeTuningMethod''dual-averaging' または 'none' から構成されるコンマ区切りのペアとして指定します。

'StepSizeTuningMethod' の値が 'dual-averaging' に設定された場合、tuneSampler は長さ固定のシミュレーションについて特定の採択比率を実現するように HMC サンプラーのリープフロッグ ステップ サイズを調整します。シミュレーションの長さは、ステップ サイズにステップ数を乗算した値です。目標採択比率を設定するには、tuneSampler メソッドの名前と値のペアの引数 'TargetAcceptanceRatio' を使用します。

例: 'StepSizeTuningMethod','none'

サンプラーの質量ベクトルの調整方法。'MassVectorTuningMethod' と次のいずれかの値から構成されるコンマ区切りのペアとして指定します。

説明
'iterative-sampling'

一連の推定質量ベクトルを使用して標本を抽出することにより、連続的な近似で MassVector を調整します。

'hessian'

startpoint における logpdf の負の対角ヘッシアンに等しい値に MassVector を設定します。

'none'

MassVector を調整しません。

調整を実行するには、tuneSampler メソッドを使用します。

例: 'MassVectorTuningMethod','hessian'

解析的勾配チェックのフラグ。'CheckGradient'true (または 1) または false (または 0) のいずれかから構成されるコンマ区切りのペアとして指定します。

'CheckGradient'true の場合、サンプラーは startpoint における数値勾配を計算し、logpdf によって返された解析的勾配と比較します。

例: 'CheckGradient',true

サンプリング変数の名前。'VariableNames' と string 配列、または文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。配列の要素は一意でなければなりません。配列の長さは startpoint の長さと同じでなければなりません。

'VariableNames' の値を与えることで、HMC サンプラーを使用してサンプリングするベクトルの成分にラベルを付けます。

例: 'VariableNames',{'Intercept','Beta'}

数値勾配の使用フラグ。'UseNumericalGradient'true (または 1) または false (または 0) のいずれかから構成されるコンマ区切りのペアとして指定します。

'UseNumericalGradient' の値を true に設定した場合、HMC サンプラーは logpdf によって返される対数密度から勾配を数値的に推定します。この場合、関数 logpdf は 2 番目の出力として対数密度の勾配を返す必要はありません。数値勾配を使用すると、HMC サンプリングが低速になります。

例: 'UseNumericalGradient',true

プロパティ

すべて展開する

ハミルトニアン ダイナミクスのステップ サイズ。正のスカラーを指定します。

マルコフ連鎖の新しい状態を提案するため、HMC サンプラーはリープフロッグ法を使用してハミルトニアン ダイナミクスを積分します。このプロパティの値は、リープフロッグ法のステップ サイズを抑制します。

ハミルトニアン ダイナミクスのステップ数。正の整数を指定します。

マルコフ連鎖の新しい状態を提案するため、HMC サンプラーはリープフロッグ法を使用してハミルトニアン ダイナミクスを積分します。このプロパティの値は、リープフロッグ法のステップ数を抑制します。

運動量変数の質量ベクトル。startpoint と同じ長さをもつ正の値の数値列ベクトルを指定します。

目的の変数に関連する運動量変数の "質量" は、マルコフ連鎖の各提案でハミルトニアン ダイナミクスを抑制します。

ステップ サイズとステップ数の微変動方法。次のいずれかの値を指定します。

説明
'jitter-both'

各リープフロッグ軌跡についてステップ サイズとステップ数をランダムに微変動させます。

'jitter-numsteps'

各リープフロッグ軌跡のステップ数のみを微変動させます。

'none'

微変動させません。

微変動させる場合、サンプラーは各リープフロッグ軌跡のステップ サイズまたはステップ数として 'StepSize' および 'NumSteps' の値より小さい値を無作為に選択します。微変動を使用すると、ハミルトニアン ダイナミクスに対するリープフロッグ法の安定性が向上します。

サンプラーのステップ サイズの調整方法。'dual-averaging' または 'none' を指定します。

StepSizeTuningMethod'dual-averaging' に等しい場合、tuneSampler は長さ固定のシミュレーションについて特定の採択比率を実現するように HMC サンプラーのリープフロッグ ステップ サイズを調整します。シミュレーションの長さは、ステップ サイズにステップ数を乗算した値です。目標採択比率を設定するには、tuneSampler メソッドの名前と値のペアの引数 'TargetAcceptanceRatio' を使用します。

サンプラーの質量ベクトルの調整方法。次のいずれかの値を指定します。

説明
'iterative-sampling'

一連の推定質量ベクトルを使用して標本を抽出することにより、連続的な近似で MassVector を調整します。

'hessian'

startpoint における logpdf の負の対角ヘッシアンに等しい値に MassVector を設定します。

'none'

MassVector を調整しません。

調整を実行するには、tuneSampler メソッドを使用します。

目標密度の対数とその勾配。関数ハンドルを指定します。

LogPDF は、[lpdf,glpdf] = LogPDF(X) である 2 つの出力引数を返します。ここで、lpdf は e を底とする (最大で加算定数までの) 対数確率密度、glpdf は点 X における対数密度の勾配です。入力引数 X は、StartPoint プロパティと同じ要素数の列ベクトルでなければなりません。

サンプラーを作成するときに 'UseNumericalGradient' の値を true に設定した場合、LogPDFglpdf で数値勾配を返します。

サンプリングを開始する初期点。数値列ベクトルを指定します。

サンプリング変数の名前。一意な文字ベクトルの cell 配列を指定します。

メソッド

diagnosticsマルコフ連鎖モンテカルロの診断情報
drawSamplesハミルトニアン モンテカルロ (HMC) の使用によるマルコフ連鎖の生成
estimateMAP対数確率密度の最大値の推定
tuneSampler ハミルトニアン モンテカルロ (HMC) サンプラーの調整

すべて折りたたむ

ハミルトニアン モンテカルロ (HMC) サンプラーを作成して、正規分布からサンプリングします。

はじめに、多変量正規対数確率密度およびその勾配を返す関数 normalDistGrad を MATLAB® パス上に保存します (normalDistGrad はこの例の終わりで定義します)。次に、引数を指定してこの関数を呼び出し、関数 hmcSampler の入力引数 logpdf を定義します。

means = [1;-3];
standevs = [1;2];
logpdf = @(theta)normalDistGrad(theta,means,standevs);

HMC サンプラーの開始点を選択します。

startpoint = randn(2,1);

HMC サンプラーを作成し、そのプロパティを表示します。

smp = hmcSampler(logpdf,startpoint);
smp
smp = 
  HamiltonianSampler with properties:

                  StepSize: 0.1000
                  NumSteps: 50
                MassVector: [2x1 double]
              JitterMethod: 'jitter-both'
      StepSizeTuningMethod: 'dual-averaging'
    MassVectorTuningMethod: 'iterative-sampling'
                    LogPDF: @(theta)normalDistGrad(theta,means,standevs)
             VariableNames: {2x1 cell}
                StartPoint: [2x1 double]

関数 normalDistGrad は、startpoint と同じ長さの列ベクトルまたはスカラーとして指定された Mu に格納されている平均および Sigma に格納されている標準偏差を使用して、多変量正規確率密度の対数を返します。2 番目の出力引数は、対応する勾配です。

function [lpdf,glpdf] = normalDistGrad(X,Mu,Sigma)
Z = (X - Mu)./Sigma;
lpdf = sum(-log(Sigma) - .5*log(2*pi) - .5*(Z.^2));
glpdf = -Z./Sigma;
end

バージョン履歴

R2017a で導入