ベイズ推定(Bayesian inference)とは?

ベイズ推定とは?

ベイズ推定は、統計学における重要な推定方法の一つで、ベイズの定理を用いて確率的な推論を行います。この方法は、未知のパラメータや状態を確率変数として扱い、得られたデータと事前に持っていた知識(事前分布)を組み合わせて、事後分布を導出します。

ベイズの定理

ベイズの定理は、条件付き確率を計算するための重要な公式であり、事象が起こった後にそれが起こる前の情報をもとにした新たな確率評価を更新する方法を提供します。トーマス・ベイズによって提案されたこの定理は、統計学、特にベイズ統計学の基礎となっています。

$$
P(A|B) = \frac{P(B|A) \times P(A)}{P(B)}
$$

$${P(A|B)}$$は事象 $${B}$$ が起こった後の事象 $${A}$$ の条件付き確率(事後確率)です。
$${P(B|A)}$$は事象 $${A}$$ が起こったときに事象 $${B}$$ が起こる条件付き確率(尤度)です。
$${P(A)}$$は事象 $${A}$$ の事前確率です。
$${P(B)}$$は事象 $${B}$$ の全確率です。

この記事ではPyMCというライブラリを利用して、Pythonでベイズ推定を行って見たいと思います。
環境はGoogle Corabです。

データの生成

観測データが正規分布に従うと仮定し、その正規分布の平均パラメータ(μ)をベイズ推定で求めるシナリオでシミュレーションを行っていきたいと思います。

平均1, 標準偏差1の正規分布から100個のデータを生成しました。

import numpy as np

np.random.seed(42)
data = np.random.normal(1, 1, 100)

ベイズモデルの構築

import pymc as pm

with pm.Model() as model:
    mu = pm.Normal('mu', mu=0, sigma=1)
    likelihood = pm.Normal('likelihood', mu=mu, sigma=1, observed=data)
    trace = pm.sample(1000)

事後分布を求めるために、事前分布と尤度関数を定義し、PyMCを用いてモデルを構築します。PyMCのsample関数を使って、MCMC(マルコフ連鎖モンテカルロ)サンプリングを行い、事後分布からサンプルを抽出します。

解析

ArviZ(ベイズ推定の結果を解析・可視化するためのライブラリ)を利用してプロットを行います。

事後分布のヒストグラムとサンプリングされたパラメータのトレースプロットを表示しています。

import arviz as az

az.style.use("arviz-darkgrid")
az.plot_trace(trace);

左が事後分布のヒストグラムで、右がトレースプロットです。
事後分布が左右対称でピークがあることから、正規分布に近い形状であると推定されます。トレースプロットに大きなトレンドや周期性が見られないことから、サンプリングが適切に行われていることを示しています。

また事後分布の要約統計(平均、標準偏差、信用区間など)をsummary関数で確認出来ます。

az.summary(trace)

結果は下記の通りになりました。

観測データの生成に使った真の平均値は1 でした。ベイズ推定で得られた平均値は0.889です。真の平均値にかなり近い推定を行う事ができています。また、推定された平均値の標準偏差は0.097であり、これは推定値の信頼性が高いことを示しています。また95%高密度区間(HDI)は0.704から1.064の範囲にあり、これは事後分布の信頼区間を示しています。この範囲内に真のパラメータ値が存在する確率が95%であることを意味します。