はじめに
この記事は、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軸の範囲(0〜1)、y軸の範囲(0〜15)を設定し、グリッド線を表示します。
self.ax.axvline(prob, linestyle=’–‘, color=’black’) でx=probの位置に黒い点線の垂直線を引きます。
アニメーションの初期設定
初期化では、self.successを0に設定し、self.line.set_data([], [])を使用してグラフに空のデータセットを追加します。
アニメーションの設定
if np.random.rand(1,) < self.prob: self.success += 1 この条件分岐では、ランダムな値がself.probより小さい場合にself.successを1増加させます(初期値はself.success=0)。
y = beta_pdf(self.x, self.success + 1, (i – self.success) + 1) この行ではベータ分布を用いてy軸のデータを生成します。
ランダム値がprobより小さい場合はsuccessが増加してパラメータaが大きくなります。一方、ランダム値がprob以上の場合はsuccessは変化せず、パラメータbが増加します。
self.line.set_data(self.x, y)によって、self.xと生成したyの値をプロットに設定します。
アニメーションの表示
ud = UpdateDist(ax, prob=0.7) によって、probパラメータを0.7に設定してUpdateDistクラスのインスタンスをud変数として作成します。
anim = FuncAnimation(fig, ud, frames=np.arange(100), init_func=ud.init, interval=100, blit=True) はfigに対してudを100フレーム実行し、各フレーム間隔を100msに設定するため、合計10秒のアニメーションとなります。init_func=ud.initでアニメーションの初期設定を実行しています。
from IPython.display import HTML
HTML(anim.to_html5_video())
とすればjupyter notebook上にアニメーションを表示できます。
まとめ
ベイズ更新のアニメーション表現によって、新しいデータが得られるたびに確率分布が更新される様子を直感的に理解することができます。このようなビジュアライゼーションは、ベイズ統計学の理解を深めるための効果的な教育ツールとなります。
コメント