棄却サンプリング
概要 1
棄却サンプリングは、与えられた分布 からサンプリングするのが難しいときに、サンプリングしやすい提案分布 を利用して に従うサンプルを得る、モンテカルロ法の一つだ。
ビルドアップ
確率変数 の確率密度関数 が与えられたとする。我々はの分布からサンプリングしたいが、それが難しい場面だとする。(例えば、の累積分布関数の逆関数を求めるのが難しいならば、サンプリングを実装するのは難しい。) そして、全ての に対して、を満たす定数と別の分布を選び出そう。この時、は一様分布や正規分布のようにサンプリングしやすい分布であるべきであり、ターゲット分布に似ているほど良い。
今、確率変数によるサンプリングでを、によるサンプリングでを得たとしよう。ここで、は一様分布だ。において2つの値を比較し、
- ならば、を採用acceptしてサンプルに加える。
- ならば、を棄却rejectしてサンプルに加えない。
定義
を確率密度関数がである確率変数とする。次を満たす別の確率密度関数と定数を選ぼう。
棄却サンプリングは、サンプルを次のように抽出する方法である。
ここで、をターゲット分布target distribution、を提案分布proposal distributionと呼ぶ。
説明
この方法は、について具体的に知っているが、それからサンプリングするのが難しいときに使用できる。要するに、棄却サンプリングとは、を満たしながらサンプリングしやすいを選び、からをサンプリングし、との差(比率)によってを確率的に棄却することを意味する。上の図を見れば、ターゲットと提案の差が大きければ大きいほど、棄却される確率が高いことがわかる。つまり、本来で表されていたが抽出される確率を、少しの数式の操作を通じてが採用される確率に変えたのである。または、分布がからに変わったので、その差分ほどサンプリングされる確率にペナルティを与えると理解もできる。
提案分布 と定数を選んだときのサンプルの採用率は次のように計算される。 したがって、十分な量のサンプルを集めるのにかかる時間は、に依存し、これを最適化するためにはを満たす最も小さいを選ばなければならない。
ジュリアで棄却サンプリングを実装し、散布図とヒストグラムを描けば、次のようになる。
コード
using Distributions
using Plots
using LaTeXStrings
N = 20000
target(x) = 0.5*pdf.(Normal(-3, 0.8), x) + pdf.(Normal(3, 3), x)
proposal = Normal(0, 5)
samples = Float64[]ㅌ
accepted = Array{Float64}[]
rejected = Array{Float64}[]
for i ∈ 1:N
x = rand(proposal)
y = rand(Uniform(0,4.2pdf(proposal, x)))
if y < target(x)
push!(samples, x)
push!(accepted, [x, y])
else
push!(rejected, [x, y])
end
end
accepted = hcat(accepted...)
rejected = hcat(rejected...)
scatter(accepted[1,:], accepted[2,:], label="accepted", color=:blue, markerstrokewidth=0, markersize=2, dpi=300, size=(728,300), legend=:outertopright)
scatter!(rejected[1,:], rejected[2,:], label="rejected", color=:red, markerstrokewidth=0, markersize=2)
savefig("RS3.png")
x = range(-15, 15, length=1000)
plot(x, target(x), label="target "*L"p(x)", framestyle=:none)
histogram!(samples, label="accepted samples", color=:blue, alpha=0.5, bins=100, normed=true, dpi=300, size=(728,300), legend=:outertopright)
savefig("RS4.png")
環境
- OS: Windows11
- Version: Julia 1.8.3, Plots v1.38.6, Distributions v0.25.80, LaTeXStrings v1.3.0
Christoper M. Bishop, Pattern Recognition annd Machine Learning (2006), p528-531 ↩︎