[matplotlib animation] 20. ベイズ更新(the bayes update)

matplotlib Animation

はじめに

matplotlibのFuncAnimationにより、ベイズ更新のアニメーションを表示する。

コード

解説

モジュールのインポート

ベータ分布の定義

ベイズの定理を使うときは、ベータ分布を使うと計算しやすい。
ベータ分布は↓のように定義される。

$$Beta(x|a,b) \equiv {\frac{\Gamma(a+b)}{\Gamma(a)\Gamma(b)}x^{a-1}(1-x)^{b-1} \\ }$$

初期設定

グラフの初期設定

self.line, = ax.plot([], [], ‘k-‘)
で空の黒線のプロットを作成する。

self.x = np.linspace(0, 1, 200)
で0〜1の200個の配列を作成。これがx軸のデータとなる。

self.ax.set_xlim(0, 1)
self.ax.set_ylim(0, 15)
self.ax.grid(True)
でx軸範囲、y軸範囲、グリッドの設定。

self.ax.axvline(prob, linestyle=’–‘, color=’black’)
でx=probの位置に垂線をひく。linestyleが–なので、点線となる。

アニメーションの初期設定

self.successを0にして、self.line.set_data([], [])でグラフに空のデータを追加する。

アニメーションの設定

if np.random.rand(1,) < self.prob:
self.success += 1
でrandomなデータがself.prob以下の場合、self.successに+1される。(初期設定でself.success=0)

y = beta_pdf(self.x, self.success + 1, (i – self.success) + 1)
でy軸のデータを生成する。

ランダムな数がprob以下のとき、successが+1されてaが増える。ランダムな数がprob以上のとき、successに変化がないので、bが増える。

self.line.set_data(self.x, y)でself.xと生成したyをプロットする。

アニメーションの表示

ud = UpdateDist(ax, prob=0.7)
でprobを0.7としてclass(UpdateDist)をudとする。

anim = FuncAnimation(fig, ud, frames=np.arange(100), init_func=ud.init, interval=100, blit=True)
でfigに対して、udを100回実行して、intervalを100 msとするので、10 sのアニメーションとなる。init_func=ud.initでアニメーションの初期設定を実行している。

from IPython.display import HTML
HTML(anim.to_html5_video())

とすればjupyter notebook上にアニメーションを表示できる。

参考

コインで理解するベータ分布 - ふんわり R-tips
表と裏、投げるとどちらかの面が出るコインを例に、ベータ分布について説明します。 ベータ分布とは 確率変数 が、 をパラメータとする確率密度関数 を持つとき、 はベータ分布 に従う、と言います。 分母に出てきた はベータ関数で、ベータ分布を積...
ベイズ推定 - Wikipedia
https://matplotlib.org/gallery/animation/bayes_update.html?highlight=bayes%20update

コメント