棄却サンプリング

サンプリングと呼ばれるものは、実際には確率分布から観測値(観測値)を生成する方法を指します。そして、この分布は通常、その確率密度関数(PDF)で表されます。さらに、PDFがわかっている場合でも、コンピューターに観測値を自動的に生成させるのは簡単な作業ではありません。基本的に、コンピューターは一様分布のサンプリングしか実現できません。では、コンピューターに適したサンプルデータサンプルを作成するにはどうすればよいでしょうか。今日は、実装方法を見ていきます。

サンプリングの問題で次の問題に直面する可能性があります。

  • コンピューターは一様分布しかサンプリングできませんが、これに基づいてより複雑な分布をサンプリングすることはできます。これを行うにはどうすればよいですか。
  • ランダム分布のいくつかの数値的特徴は、積分の形で解く必要があるかもしれませんが、いくつかの積分は分析解を持っていない(または得るのが難しい)かもしれません。
  • ベイズ推定では、事後確率の分布は事前確率と尤度関数の積よりも大きくなりますが、事前確率と尤度関数の積は比較的複雑になる可能性があります。この複雑な分布をどのように処理する必要がありますか?サンプリングについてはどうでしょうか。 ?

これらの問題に対する一連の解決策が導き出されます。

1.棄却-棄却サンプリング

数学では、棄却サンプリングは、分布から観測値を生成するために使用される基本的な手法です。棄却採択法または「棄却採択アルゴリズム」とも呼ばれ、メトロポリス・ヘイスティングスアルゴリズムにも関連するモンテカルロ法です。

1.簡単な理解

次の図は、確率変数の密度関数曲線です。この確率変数のサンプルを取得するにはどうすればよいですか?
ここに画像の説明を挿入します
次のように、この曲線の形状を使用してサンプルを描画し、密度曲線を長方形でラップし、密度曲線を長方形で囲みます。
ここに画像の説明を挿入します
次に、この長方形にランダムにポイントをキャストします。ランダムにキャストされたポイントは、これらのポイントが長方形の領域に均等に分布していることを意味します。以下に示すように、約10,000ポイントがキャストされました。
ここに画像の説明を挿入します
明らかに、密度曲線の下側にあるポイントと、密度曲線の上側にあるポイントがあります。次の図に示すように、上側のポイントは緑で表され、下側のポイントは青で表されます。
ここに画像の説明を挿入します
密度曲線の下側のポイント、つまり青いポイントのみが保持されます。 :
ここに画像の説明を挿入します
ここで、密度曲線の下に質問があります。ブロック領域では、これらの点はどのような分布を満たしていますか?均等に分散!これは、サンプリングを拒否するための最も重要な部分です。長方形を作成したり、長方形に点を投げたりするなど、密度曲線で囲まれた領域の均一な分布を得るためにすべてが行われます。密度曲線の下で一様分布を満たすようなサンプルを取得できる限り、密度曲線に一致する確率変数のサンプリングサンプルを取得できます。方法は、各青い点の横座標のみを抽出することであり、これらの横座標によって形成されたサンプルがターゲットサンプルです。下の図の左側は、上記の方法とカーネル密度推定に従って得られたサンプルのヒストグラムであり、下の図の右側は、開始密度曲線です。
ここに画像の説明を挿入します
サンプリングされたサンプルのカーネル密度推定は基本的にターゲット密度曲線と一致しており、このサンプルがターゲットサンプルであることは確かです。

当初は長方形を使用していましたが、この長方形は一様分布を満たす推奨分布です。推奨分布は、ターゲット密度関数曲線の下で一様分布のサンプルを取得するための補助ツールにすぎません。推奨される分布として一様分布を使用することは、非常に非効率的な場合があります。なぜそう言うのですか?上記の例から、均等に分布している多くのポイント(緑色のポイント)が削除され、一種の無駄が発生していることがわかります。次の図に示すように、他のいくつかの曲線を選択して密度曲線を構成すると、効率が少し向上します。
ここに画像の説明を挿入します
数値曲線はh(x)で、下の図の青い線に対応します。推奨される分布密度曲線はg(x)であり、g(x)に定数係数cを掛けると、ターゲット密度曲線はcg(x)の曲線で囲まれます。

g(x)を満たす確率変数はサンプリングが容易であると想定しているため、サンプリングを拒否する手順は次のとおりです。

  • g(x)からサンプルデータを収集し、x⋆x^ {\ star}と表記します。バツ、私たちはそれを提案として受け取ります
  • この提案をh(x)分布を満たすサンプルデータとして受け入れる必要がありますか?受け入れ確率を定義します。

言い換えれば、α\ alphaを使用しますxを受け入れるα確率⋆x^ {\ star}バツ⋆はh(x)分布のサンプルデータとして使用されます。実際の操作では、U(0、1)U(0、1)を取りますU 0 1 乱数μ\ muμμ<α\ mu <\ alphaの場合μ<αxを受け入れるだけ⋆x^(\ star)バツ⋆はh(x)のサンプルデータとして使用されます。それ以外の場合は、それを破棄し、手順1に戻ってループを続行します。最後に、サンプルを取得できます。

  • 記事の冒頭では一度に1万点が引かれましたが、どうやって次々とポイントが出てきたのでしょうか?実際、それらは対応しており、青い点を削除するプロセスは、拒否するかどうかを判断するプロセスと同じです。
  • 密度曲線の下に一様分布のサンプルがある場合、密度曲線に一致する分布のサンプルを取得できます。
  • 提案された分布の形状が目標分布に近い場合、サンプリング効率は高くなります。

2.棄却-棄却サンプリングプロセス

ここに画像の説明を挿入します

3.棄却サンプリングの直感的な説明

ここに画像の説明を挿入します

4.棄却サンプリングの妥当性の証明(予定)

ここに画像の説明を挿入します
ここに画像の説明を挿入します

5.pythonの実装

ここに画像の説明を挿入します
2.生成されるコードは次のとおりです。

import random
import math
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

%matplotlib inline
sns.set_style('darkgrid')
plt.rcParams['figure.figsize'] = (12, 8)


def AceeptReject(split_val):
    global c
    global power
    while True:
        x = random.uniform(0, 1)
        y = random.uniform(0, 1)
        if y*c <= math.pow(x - split_val, power):
            return x

power = 4
t = 0.4  
sum_ = (math.pow(1-t, power + 1) - math.pow(-t, power + 1)) / (power + 1)  #求积分
x = np.linspace(0, 1, 100)
#常数值c
c = 0.6**4/sum_
cc = [c for xi in x]
plt.plot(x, cc, '--',label='c*f(x)')
#目标概率密度函数的值f(x)
y = [math.pow(xi - t, power)/sum_ for xi in x]
plt.plot(x, y,label='f(x)')
#采样10000个点
samples = []
for  i in range(10000):
    samples.append(AceeptReject(t))
plt.hist(samples, bins=50, normed=True,label='sampling')
plt.legend()
plt.show()

ここに画像の説明を挿入します

5.まとめ

ここに画像の説明を挿入します

一般的なサンプリングシミュレーションの総和法としてモンテカルロ法を使用する場合は、マルコフ連鎖の助けが必要です。

https://gaolei786.github.io/statistics/reject.html
https://zhuanlan.zhihu.com/p/75264565

おすすめ

転載: blog.csdn.net/Anne033/article/details/109841951