Nested sampling algorithm

Nested sampling algorithmとは、ベイズ統計におけるモデル比較、及び事後分布からのサンプル生成のための計算手法である。 2004年に物理学者のジョン・スキリング（John Skilling）によって開発された。 ベイズの定理によれば、同時に真となることはない二つのモデルの組 ( M 1 , M 2 ) {\displaystyle (M_{1},M_{2})} に対し、データ D {\displaystyle D} を観測した時のモデル M 1 {\displaystyle M_{1}} の事後確率は次のように計算できる： P ( M 1 ∣ D ) = P ( D ∣ M 1 ) P ( M 1 ) P ( D ) = P ( D ∣ M 1 ) P ( M 1 ) P ( D ∣ M 1 ) P ( M 1 ) + P ( D ∣ M 2 ) P ( M 2 ) = 1 1 + P ( D ∣ M 2 ) P ( D ∣ M 1 ) P ( M 2 ) P ( M 1 ) {\displaystyle {\begin{aligned}P(M_{1}\mid D)&={\frac {P(D\mid M_{1})P(M_{1})}{P(D)}}\\&={\frac {P(D\mid M_{1})P(M_{1})}{P(D\mid M_{1})P(M_{1})+P(D\mid M_{2})P(M_{2})}}\\&={\frac {1}{1+{\frac {P(D\mid M_{2})}{P(D\mid M_{1})}}{\frac {P(M_{2})}{P(M_{1})}}}}\end{aligned}}} ここで M 1 {\displaystyle M_{1}} と M 2 {\displaystyle M_{2}} に対する事前確率は既知であるとする。事後確率を求めるには残りのベイズ因子 P ( D ∣ M 2 ) / P ( D ∣ M 1 ) {\displaystyle P(D\mid M_{2})/P(D\mid M_{1})} を求める必要があるが、一般にNuisance paramterを周辺化（積分）する必要があるため、評価はそれほど簡単ではない。一般にモデル M {\displaystyle M} がパラメータ θ {\displaystyle \theta } （多次元であってもよく、モデルにより異なっても良い）を持つとき、 M {\displaystyle M} の周辺化は次のようになる： P ( D ∣ M ) = ∫ d θ P ( D ∣ θ , M ) P ( θ ∣ M ) {\displaystyle P(D\mid M)=\int d\theta \,P(D\mid \theta ,M)P(\theta \mid M)} この積分はしばしば解析的に扱いにくいものであり、数値アルゴリズムを用い近似値を求める必要があります。Nested sampling algorithmは、特にこういった周縁化積分の近似計算のためにJohn Skillingによって開発され、積分計算と同時に事後分布 P ( θ ∣ D , M ) {\displaystyle P(\theta \mid D,M)} からのサンプルが生成できるという追加の利点がある 。これはベイズ推定の観点からはブリッジサンプリングや防御的重要度サンプリングなどの方法に代わるものである。 Nested sampling algorithmの単純なバージョンは次のようになる。周辺確率密度 Z = P ( D ∣ M ) {\displaystyle Z=P(D\mid M)} は以下のように計算される： Start with  N {\displaystyle N}  points  θ 1 , … , θ N {\displaystyle \theta _{1},\ldots ,\theta _{N}}  sampled from prior.  for  i = 1 {\displaystyle i=1}  to  j {\displaystyle j}  do   % The number of iterations j is chosen by guesswork. L i := min ( {\displaystyle L_{i}:=\min(} current likelihood values of the points ) {\displaystyle )} ;  X i := exp ⁡ ( − i / N ) ; {\displaystyle X_{i}:=\exp(-i/N);}   w i := X i − 1 − X i {\displaystyle w_{i}:=X_{i-1}-X_{i}} Z := Z + L i ⋅ w i ; {\displaystyle Z:=Z+L_{i}\cdot w_{i};}   Save the point with least likelihood as a sample point with weight  w i {\displaystyle w_{i}} . Update the point with least likelihood with some Markov chain Monte Carlo steps according to the prior, accepting only steps that keep the likelihood above  L i {\displaystyle L_{i}} .  end  return  Z {\displaystyle Z} ; 各繰り返しステップにおいて X i {\displaystyle X_{i}} は、 θ i {\displaystyle \theta _{i}} における値より大きい尤度をもつようなパラメータ空間の体積の推定値である。重み w i {\displaystyle w_{i}} は2つの超曲面 { θ ∣ P ( D ∣ θ , M ) = P ( D ∣ θ i − 1 , M ) } {\displaystyle \{\theta \mid P(D\mid \theta ,M)=P(D\mid \theta _{i-1},M)\}} 及び { θ ∣ P ( D ∣ θ , M ) = P ( D ∣ θ i , M ) } {\displaystyle \{\theta \mid P(D\mid \theta ,M)=P(D\mid \theta _{i},M)\}} の間の体積の推定値である。更新手順 Z := Z + L i w i {\displaystyle Z:=Z+L_{i}w_{i}} により、 L i w i {\displaystyle L_{i}w_{i}} の i {\displaystyle i} による合計を計算することで、以下の積分を数値的に近似する： P ( D ∣ M ) = ∫ P ( D ∣ θ , M ) P ( θ ∣ M ) d θ = ∫ P ( D ∣ θ , M ) d P ( θ ∣ M ) {\displaystyle {\begin{aligned}P(D\mid M)&=\int P(D\mid \theta ,M)P(\theta \mid M)\,d\theta \\&=\int P(D\mid \theta ,M)\,dP(\theta \mid M)\end{aligned}}} j → ∞ {\displaystyle j\to \infty } の極限でこの推定量には 1 / N {\displaystyle 1/N} の正のバイアスがあるが 、 ( 1 − 1 / N ) {\displaystyle (1-1/N)} の代わりに exp ⁡ ( − 1 / N ) {\displaystyle \exp(-1/N)} を上記のアルゴリズムで用いることでこの誤差を取り除くことができる。 この計算手法の発想は、 f ( θ ) = P ( D ∣ θ , M ) {\displaystyle f(\theta )=P(D\mid \theta ,M)} の範囲を細分化し、各間隔 [ f ( θ i − 1 ) , f ( θ i ) ] {\displaystyle [f(\theta _{i-1}),f(\theta _{i})]} ごとに、ランダムに選択された点 θ {\displaystyle \theta } がこの区間内に存在する確率を推定する、ということである。これはルベーグ積分を数値的に実装するベイズ流の方法と考えることができる。 Nested sampling algorhithmの各プログラミング言語ごとの公開済み実装例は以下の通り。 C 、 R 、またはPythonの簡単な例は、JohnSkillingのWebサイトにある。 上記の単純なコードのHaskell実装例はHackageにある。 スペクトルをフィッティングするために設計されたRの例は出典で説明されており、GitHub上にも存在する。 DiamondsというC ++の例は、GitHubにある。 統計物理学と物性物理学で使用する高度にモジュール化されたPythonの例は、GitHubにあります。 pymatnestは、さまざまな材料のエネルギー地形を探索し、任意の温度での熱力学的変数を計算し、相転移を特定するために設計されたPythonパッケージである。 MultiNestは、多峰性事後分布のNested sampling algorithmによるサンプリングを実行できる。 C ++、Fortran、Python入力用のインターフェースがあり、GitHubで入手できる。 PolyChordは、GitHubで利用できるもう1つのNested sampling algorithmソフトウェアパッケージである。 PolyChordの計算効率は、パラメーターの数が増えるとMultiNestより適切にスケーリングされる。つまり、PolyChordは、高次元の問題に対してより効率的になる場合がある。 NestedSamplers.jl：単一および複数の楕円体のネストされたサンプリングアルゴリズムを実装するためのJulia パッケージがGitHub上にある。 Nested sampling algorithm は2004年に提案されて以来、天文学の分野の多くの側面で使用されており、宇宙論的モデルの選択と物体検出にも使用された。これは、「精度、一般的な適用性、および計算の実現可能性を併せ持っている」ためである。 多峰性事後確率を処理するためのアルゴリズムの改良が、現存するデータセット内の天体を検出する手段として提案されている。 Nested sampling algorithmの他の応用は、アルゴリズムを使用して最適な有限要素モデルを選択する有限要素更新の分野にあり、これは構造ダイナミクスに適用された。 このサンプリング方法は、材料モデリングの分野でも使用されている。統計力学から分配関数を学習し、熱力学的特性を導き出すためにも使用できる。 動的 Nested samplingは、Nested sampling algorithmの一般化であり、計算の精度が最大になるようにパラメータ空間のさまざまな領域で取得されるサンプルの数が動的に調整される。 これにより、サンプルの割り当てを変更できず、計算精度にほとんど影響を与えない領域で多くのサンプルが取得される、元のNested sampling algorithm と比較して、精度と計算効率が大幅に向上する場合がある。 公開されている動的Nested samplingのソフトウェアパッケージには、次のものがある。 dynesty -GitHubからダウンロードできる動的なネストされたサンプリングのPython実装。 dyPolyChord：Python、C ++、Fortranの尤度および事前分布で使用できるソフトウェアパッケージ。 dyPolyChordはGitHubで入手できる。 動的Nested samplingは色々な科学分野で使用され、重力波検出、空間内の距離のマッピング 、太陽系外惑星の検出など、さまざまな科学的問題に適用されてきた。 ベイズ因子