HamiltonianSampler クラス
ハミルトニアン モンテカルロ (HMC) サンプラー
説明
ハミルトニアン モンテカルロ (HMC) サンプラーは、確率密度 P(x) からの標本生成に使用可能な、勾配ベースのマルコフ連鎖モンテカルロ サンプラーです。HMC サンプリングでは、log P(x) およびその勾配を指定する必要があります。
パラメーター ベクトル x は制約なしでなければなりません。つまり、x のどの要素も任意の実数をとり得ます。制約があるパラメーターをサンプリングするには、HMC サンプラーを使用する前に、このようなパラメーターを制約なしの変数に変換します。
サンプラーの作成後、このクラスのメソッドを使用して、MAP (最大事後確率) 点推定の計算、サンプラーの調整、標本の抽出、収束診断のチェックを行うことができます。このワークフローの例については、ハミルトニアン モンテカルロの使用によるベイズ線形回帰を参照してください。
構築
は、ハミルトニアン モンテカルロ (HMC) サンプラーを作成し、hmc
= hmcSampler(logpdf
,startpoint
)HamiltonianSampler
オブジェクトとして返します。logpdf
は、平衡分布の確率密度の対数およびその勾配を評価する関数ハンドルです。列ベクトル startpoint
は、HMC サンプリングを開始する初期点です。
では、1 つ以上の名前と値のペアの引数を使用して追加オプションを指定します。名前と値のペアの引数は、他のすべての入力引数の後で指定します。hmc
= hmcSampler(___,Name,Value
)
入力引数
logpdf
— 目標密度の対数とその勾配
関数ハンドル
目標密度の対数とその勾配。関数ハンドルを指定します。
logpdf
は、[lpdf,glpdf] = logpdf(X)
である 2 つの出力引数を返さなければなりません。ここで、lpdf
は e を底とする (最大で加算定数までの) 対数確率密度、glpdf
は対数密度の勾配、点 X
は startpoint
と同じ要素数の列ベクトルです。
logpdf
の入力引数 X
は制約なしでなければなりません。つまり、X
のどの要素も任意の実数をとり得ます。HMC サンプラーの使用前に制約付きサンプリング パラメーターを制約なしの変数に変換してください。
'UseNumericalGradient'
の値が true
に設定された場合、logpdf
は 2 番目の出力として勾配を返す必要はありません。数値勾配を使用する方が logpdf
による勾配計算が不要になるため簡単になる可能性がありますが、サンプリング速度が落ちる場合もあります。
データ型: function_handle
startpoint
— サンプリングを開始する初期点
数値列ベクトル
サンプリングを開始する初期点。数値列ベクトルを指定します。
データ型: single
| double
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで Name
は引数名、Value
は対応する値です。名前と値の引数は他の引数の後ろにする必要がありますが、ペアの順序は関係ありません。
R2021a より前では、名前と値をそれぞれコンマを使って区切り、Name
を引用符で囲みます。
例: 'VariableNames',{'Intercept','Beta'},'MassVectorTuningMethod','hessian'
は、サンプリング変数の名前と、質量ベクトルの調整法として 'hessian'
を指定します。
StepSize
— ハミルトニアン ダイナミクスのステップ サイズ
0.1
(既定値) | 正のスカラー
ハミルトニアン ダイナミクスのステップ サイズ。'StepSize'
と正のスカラーから構成されるコンマ区切りのペアとして指定します。
マルコフ連鎖の新しい状態を提案するため、HMC サンプラーはリープフロッグ法を使用してハミルトニアン ダイナミクスを積分します。この引数は、リープフロッグ法のステップ サイズを抑制します。
ステップ サイズは、tuneSampler
を使用して自動的に調整できます。
例: 'StepSize',0.2
NumSteps
— ハミルトニアン ダイナミクスのステップ数
50
(既定値) | 正の整数
ハミルトニアン ダイナミクスのステップ数。'NumSteps'
と正の整数から構成されるコンマ区切りのペアとして指定します。
マルコフ連鎖の新しい状態を提案するため、HMC サンプラーはリープフロッグ法を使用してハミルトニアン ダイナミクスを積分します。この引数は、リープフロッグ法のステップ数を抑制します。
ステップ数は、tuneSampler
を使用して自動的に調整できます。
例: 'NumSteps',20
MassVector
— 運動量変数の質量ベクトル
ones(size(startpoint,1),1)
(既定値) | 数値列ベクトル
運動量変数の質量ベクトル。'MassVector'
と、正の値をもち長さが startpoint
に等しい数値列ベクトルから構成されるコンマ区切りのペアとして指定します。
目的の変数に関連する運動量変数の "質量" は、マルコフ連鎖の各提案でハミルトニアン ダイナミクスを抑制します。
質量ベクトルは、tuneSampler
を使用して自動的に調整できます。
例: 'MassVector',rand(3,1)
JitterMethod
— ステップ サイズとステップ数の微変動方法
'jitter-both'
(既定値) | 'jitter-numsteps'
| 'none'
ステップ サイズとステップ数の微変動方法。'JitterMethod'
と次のいずれかから構成されるコンマ区切りのペアとして指定します。
値 | 説明 |
---|---|
'jitter-both' | 各リープフロッグ軌跡についてステップ サイズとステップ数をランダムに微変動させます。 |
'jitter-numsteps' | 各リープフロッグ軌跡のステップ数のみを微変動させます。 |
'none' | 微変動させません。 |
微変動させる場合、サンプラーは各リープフロッグ軌跡のステップ サイズまたはステップ数として 'StepSize'
および 'NumSteps'
の値より小さい値を無作為に選択します。微変動を使用すると、ハミルトニアン ダイナミクスに対するリープフロッグ法の安定性が向上します。
例: 'JitterMethod','jitter-both'
StepSizeTuningMethod
— サンプラーのステップ サイズの調整方法
'dual-averaging'
(既定値) | 'none'
サンプラーのステップ サイズの調整方法。'StepSizeTuningMethod'
と 'dual-averaging'
または 'none'
から構成されるコンマ区切りのペアとして指定します。
'StepSizeTuningMethod'
の値が 'dual-averaging'
に設定された場合、tuneSampler
は長さ固定のシミュレーションについて特定の採択比率を実現するように HMC サンプラーのリープフロッグ ステップ サイズを調整します。シミュレーションの長さは、ステップ サイズにステップ数を乗算した値です。目標採択比率を設定するには、tuneSampler
メソッドの名前と値のペアの引数 'TargetAcceptanceRatio'
を使用します。
例: 'StepSizeTuningMethod','none'
MassVectorTuningMethod
— サンプラーの質量ベクトルの調整方法
'iterative-sampling'
(既定値) | 'hessian'
| 'none'
サンプラーの質量ベクトルの調整方法。'MassVectorTuningMethod'
と次のいずれかの値から構成されるコンマ区切りのペアとして指定します。
値 | 説明 |
---|---|
'iterative-sampling' | 一連の推定質量ベクトルを使用して標本を抽出することにより、連続的な近似で |
'hessian' |
|
'none' | |
調整を実行するには、tuneSampler
メソッドを使用します。
例: 'MassVectorTuningMethod','hessian'
CheckGradient
— 解析的勾配チェックのフラグ
true
(または 1
) (既定値) | false
(または 0
)
解析的勾配チェックのフラグ。'CheckGradient'
と true
(または 1
) または false
(または 0
) のいずれかから構成されるコンマ区切りのペアとして指定します。
'CheckGradient'
が true
の場合、サンプラーは startpoint
における数値勾配を計算し、logpdf
によって返された解析的勾配と比較します。
例: 'CheckGradient',true
VariableNames
— サンプリング変数の名前
{'x1','x2',...}
(既定値) | string 配列 | 文字ベクトルの cell 配列
サンプリング変数の名前。'VariableNames'
と string 配列、または文字ベクトルの cell 配列から構成されるコンマ区切りのペアとして指定します。配列の要素は一意でなければなりません。配列の長さは startpoint
の長さと同じでなければなりません。
'VariableNames'
の値を与えることで、HMC サンプラーを使用してサンプリングするベクトルの成分にラベルを付けます。
例: 'VariableNames',{'Intercept','Beta'}
UseNumericalGradient
— 数値勾配の使用フラグ
false
(または 0
) (既定値) | true
(または 1
)
数値勾配の使用フラグ。'UseNumericalGradient'
と true
(または 1
) または false
(または 0
) のいずれかから構成されるコンマ区切りのペアとして指定します。
'UseNumericalGradient'
の値を true
に設定した場合、HMC サンプラーは logpdf
によって返される対数密度から勾配を数値的に推定します。この場合、関数 logpdf
は 2 番目の出力として対数密度の勾配を返す必要はありません。数値勾配を使用すると、HMC サンプリングが低速になります。
例: 'UseNumericalGradient',true
プロパティ
StepSize
— ハミルトニアン ダイナミクスのステップ サイズ
0.1
(既定値) | 正のスカラー
ハミルトニアン ダイナミクスのステップ サイズ。正のスカラーを指定します。
マルコフ連鎖の新しい状態を提案するため、HMC サンプラーはリープフロッグ法を使用してハミルトニアン ダイナミクスを積分します。このプロパティの値は、リープフロッグ法のステップ サイズを抑制します。
NumSteps
— ハミルトニアン ダイナミクスのステップ数
50
(既定値) | 正の整数
ハミルトニアン ダイナミクスのステップ数。正の整数を指定します。
マルコフ連鎖の新しい状態を提案するため、HMC サンプラーはリープフロッグ法を使用してハミルトニアン ダイナミクスを積分します。このプロパティの値は、リープフロッグ法のステップ数を抑制します。
MassVector
— 運動量変数の質量ベクトル
ones(size(startpoint,1),1)
(既定値) | 数値列ベクトル
運動量変数の質量ベクトル。startpoint
と同じ長さをもつ正の値の数値列ベクトルを指定します。
目的の変数に関連する運動量変数の "質量" は、マルコフ連鎖の各提案でハミルトニアン ダイナミクスを抑制します。
JitterMethod
— ステップ サイズとステップ数の微変動方法
'jitter-both'
(既定値) | 'jitter-numsteps'
| 'none'
ステップ サイズとステップ数の微変動方法。次のいずれかの値を指定します。
値 | 説明 |
---|---|
'jitter-both' | 各リープフロッグ軌跡についてステップ サイズとステップ数をランダムに微変動させます。 |
'jitter-numsteps' | 各リープフロッグ軌跡のステップ数のみを微変動させます。 |
'none' | 微変動させません。 |
微変動させる場合、サンプラーは各リープフロッグ軌跡のステップ サイズまたはステップ数として 'StepSize'
および 'NumSteps'
の値より小さい値を無作為に選択します。微変動を使用すると、ハミルトニアン ダイナミクスに対するリープフロッグ法の安定性が向上します。
StepSizeTuningMethod
— サンプラーのステップ サイズの調整方法
'dual-averaging'
(既定値) | 'none'
サンプラーのステップ サイズの調整方法。'dual-averaging'
または 'none'
を指定します。
StepSizeTuningMethod
が 'dual-averaging'
に等しい場合、tuneSampler
は長さ固定のシミュレーションについて特定の採択比率を実現するように HMC サンプラーのリープフロッグ ステップ サイズを調整します。シミュレーションの長さは、ステップ サイズにステップ数を乗算した値です。目標採択比率を設定するには、tuneSampler
メソッドの名前と値のペアの引数 'TargetAcceptanceRatio'
を使用します。
MassVectorTuningMethod
— サンプラーの質量ベクトルの調整方法
'iterative-sampling'
(既定値) | 'hessian'
| 'none'
サンプラーの質量ベクトルの調整方法。次のいずれかの値を指定します。
値 | 説明 |
---|---|
'iterative-sampling' | 一連の推定質量ベクトルを使用して標本を抽出することにより、連続的な近似で |
'hessian' |
|
'none' | |
調整を実行するには、tuneSampler
メソッドを使用します。
LogPDF
— 目標密度の対数とその勾配
関数ハンドル
目標密度の対数とその勾配。関数ハンドルを指定します。
LogPDF
は、[lpdf,glpdf] = LogPDF(X)
である 2 つの出力引数を返します。ここで、lpdf
は e を底とする (最大で加算定数までの) 対数確率密度、glpdf
は点 X
における対数密度の勾配です。入力引数 X
は、StartPoint
プロパティと同じ要素数の列ベクトルでなければなりません。
サンプラーを作成するときに 'UseNumericalGradient'
の値を true
に設定した場合、LogPDF
は glpdf
で数値勾配を返します。
StartPoint
— サンプリングを開始する初期点
数値列ベクトル
サンプリングを開始する初期点。数値列ベクトルを指定します。
VariableNames
— サンプリング変数の名前
{'x1','x2',...}
(既定値) | 一意な文字ベクトルの cell 配列
サンプリング変数の名前。一意な文字ベクトルの 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 で導入
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)