PyMC3でWBIC

​​◯タイトル通り,PyMC3でWBICを求めてみました。 なお,WAICはpymc3.stats.waicで求められるので*1,やっていません。

◯元ネタは,以下の記事です。 RのstanでやられていたのをPythonのPyMC3に移植してみました。

statmodeling.hatenablog.com

◯私が頑張った*2ポイントとしては,以下の3点です。(詳しくはコードを見て下さい)

  • 逆温度をもつ分布が標準実装されてないので,Custom Distributionで作った
  • observed=Yと一括で指定することはせずに,データ数だけ分布を用意してobserved=Y[i]としたか
  • WBICにデータごとの対数尤度が必要になるので,pm.Deterministicobs[i].logpt / betaして無理矢理取ってくる

◯実際に用いたコードは文末に添付しますので参考にしてください。実行すると

model1|WBIC = 201.884
model2|WBIC = 194.659

のような結果が得られ,ちゃんと混合正規分布のmodel2が選べています。

◯結果の信憑性については,先のstanでやられていた方の結果と整合しました。 が,間違っているところやベストプラクティスがあれば是非コメントしてください。

PyMC3で混合正規分布の推定。正規分布と混合正規分布の2つを用いて,WBICでモデル選択

※モデル内のy_predは,事後分布を可視化する用に突っ込んでいます。WBICの計算には不要です。


追記

◯このツイートでアクセス数が急増しました。 普段フォローしている方のRTもあり,びっくりしています。しかし,ちょっと嬉しいですね。言及をいただいたこと,この場でお礼申し上げます。

*1:公式Example|https://docs.pymc.io/notebooks/model_comparison.html

*2:どう実装するかわからず,無能すぎて2日も悩んでしまいました。