🪙
Juliaでコイントスのパラメータの事後分布を推定する
Juliaで作って学ぶベイズ統計学という本を読んでいます。
用語の確認
- 同時確率
- 複数の事象が同時に起きる確率
P(X, Y)
- 周辺確率
- 同時確率から複数の事象(確率変数)を除いた確率
P(X) = \sum_Y P(X, Y)
- 条件付き確率
- ある事象が起こる確率における、ある事象の確率(言語化むずい)
- Yが起こる事象のうち、Xが起こる事象の確率
P(X|Y) = \frac{P(X,Y)}{P(Y)}
- 事前分布
- パラメータを生成する確率分布
- 事後分布
- 観測結果という制約が入った前提で、パラメータを生成する尤もらしい確率分布
生半可な考えだが、事前分布は時間に順行しているが、事後分布は時間に逆行した視点だと解釈している。事後分布は、観測結果という強い証拠を持ち合わせている。
本題
Aさんは、コイントスで表が出る確率をランダムに決める。その確率をもとに、
これをかしこまった言い方にして、解いていく。
パラメータ
ベルヌーイ分布
観測結果が起こるような同時分布は次のように書ける。
求めたい観測結果
分子については、ベルヌーイ分布と一様分布の同時確率として与えられるが、分母については計算が必要になる。
分母
まとめると、求めたい観測結果
これをJuliaで数値積分をすることによって具体的な計算を行う。
# 観測結果
X_obs = [0, 0, 0, 1, 1, 1, 1, 1]
# 同時確率分布 p(X, μ), 分子に相当
p_joint(X, μ) = prod(pdf.(Bernoulli(μ), X)) * pdf(Uniform(0, 1), μ)
# 周辺尤度を計算する関数を返す
function approx_integration(μ_range, p)
Δ = μ_range[2] - μ_range[1]
X -> sum([p(X, μ) * Δ for μ in μ_range])
end
# ベルヌーイ分布なのでμの積分範囲は0 ~ 1
μ_range = 0:1e-2:1
# 周辺尤度, 分母に相当
p_marginal = approx_integration(μ_range, p_joint)
# 事後分布
postprior(μ) = p_joint(X_obs, μ) / p_marginal(X_obs)
plot(postprior, label="", xlabel="μ")
このコードを実行すると、次のようなパラメータ
参考文献
- Juliaで作って学ぶベイズ統計学 | 講談社
Discussion