書評.この広告は、90日以上更新していないブログに表示しています。R前回の理論的なまとめを踏まえてStanでWAICとWBICを計算してみます。今回は例題として混合正規分布から発生させたデータ100個を用いて、2種類のモデルで推定を行い、それぞれに対してWAICとWBICを求めてみます。データ生成部分のRコードは以下です。sd2))次にモデルその1の説明です。ここでは2つの正規分布のうち平均0の方は固定で、もう片方の正規分布の平均(mu)とそれらの混ぜ具合(a)を推定することにします。Stanコードは以下です(model1a.stan)。RでWAICの計算をする際に1データごとの対数尤度が必要になるのでそれを計算しています。error)の計算をする際に予測分布が必要になるのでそれを計算しています。WBICは逆温度が1/log(データ数)の時の事後分布を用いて計算されます。掛けておけばよいと理解しています。よってStanコードは以下になりました(model1b.stan)。この部分が上記で述べたところになります。次にモデルその2の説明です。ここでは1つの正規分布であてはめを行い、平均(mu)と標準偏差(s)を推定することにします。Stanコードは以下です(model2a.stan)。s);}同様に逆温度が1/log(データ数)の時のStanコードは以下です(model2b.stan)。s);}ここからが本番です。これらのモデルを使って推定を行い、WAICとWBICを定義に沿って計算していくRコードは以下になりました。今回は真のモデル(f_true)が分かっているので汎化誤差(ge)を求めることができます。23~24行目では予測分布(を近似した関数)を求めています。27~28行目はコメントアウトしていますが、エントロピーを求めたい場合に使います。WAICを求めています。渡辺ベイズ本のp.167参照。WBICを求めています。渡辺先生のWebページを参照。結果は以下の表のようになりました。201.1今回はモデル1とモデル2の比較ではモデル1の方がよさそうと判断できそうです。ちなみにデータ生成部分のmean2を0にするとモデル2の方がWAICもWBICも低くなります。将来はstanの中でWAICを算出する機能が出てくるとは思いますが、いつになるか分からないので当分は自分で計算しようと思います。計算コストも低いですし。Bobさんが実装したWAICとオーダーすら異なる...汎化誤差のオーダーを見ると僕の方が正しそうだけど不安だ。BDA3内の定義が渡辺ベイズ本と異なるっぽいな。」というページの(注0)にBDA3と渡辺ベイズ本の定義が異なることがちゃんと書かれてありました。Nをデータ数として、渡辺ベイズ本のWAICの定義式を2N倍したものが、BDA3での定義になっています。hatをデータ数Nで割ったものがfunctional_variance_div_Nと一致します。数値も一致することを確認しました。個人的には、2N倍していない方、すなわちNを大きくしたときには汎化誤差に近づいた値を得た方がよいと思っていて、それはこれから何回もWAICの値そのものを見ていくうちに、「このモデル(分布)でこれぐらいの数値だとかなり悪そうだな」というような経験・手ごたえが蓄積できたらいいなぁと思っているためです。AICやDICとどうしても比べたい場合は2N倍した方を使うのがよいでしょう。00:00WAICとWBICを事後分布から計算するTweet広告を非表示にする関連記事2019-06-13Stanで1変数の積分を実行するStan2.19でモデルの内部で1変数の積分を実行する機能が追加され...2018-04-01PythonのSymPyで変分ベイズの例題を理解するこの記事の続きです。(2)月別アーカイブはてなブログをはじめよう!StatModelingさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。