More Related Content
More from Wataru Shito (20)
2019年 演習II.第2章 例題: カンニングした学生の割合
- 1. 第 2 章 例題: カンニングした学生の割合
市東 亘
西南学院大学 経済学部
July 15, 2019
講義ノート: https://courses.wshito.com/semi2/2019-bayes-AI
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 1 / 12
- 5. 分析の目的
統計モデルの構築
▶ 我々が知りたいのは p の事後分布: f(p|D) ∝ f(D|p)f(p)
▶ 事前分布 f(p) は「理由不十分の原則」から一様分布を採用.
▶ 尤度 f(D|p) をどのように定義するか?
▶ 尤度はデータが与えられた時,その事象が生起する確率を求めるのに
使用する密度関数の式を,パラメータが所与でデータを変数と読み替
えたもの.
▶ したがって「カンニング」と回答したデータが得られた時,そのデー
タが得られる確率を計算する密度関数を尤度に指定する.
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 5 / 12
- 6. 分析の目的
統計モデルの構築: 尤度の定義
▶ 尤度に与えるデータは何か?カンニングしたか否かの個別データ?
⇒ 回答の順番に意味はない!カンニング総数だけが意味を持つ!
▶ したがって使用する標本データはカンニング数 x.
▶ 我々が観測できるカンニング数 x はコイン投げ後のもの.
▶ コイン投げ後のカンニング数 x が標本総数 N に占める割合は,
1
2
p + 1
4
▶ したがって,標本データのカンニング数 x は確率 1
2
p + 1
4
の 2 項分布
に従う.
⇒ x ∼ ˆpx(1 − ˆp)N−x ただし,ˆp = 1
2
p + 1
4
.
▶ テキストの例では尤度に与える標本データ x は 35 としている.
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 6 / 12
- 7. 分析の目的
ベイズモデル
f(p|D) ∝ f(D|p)f(p)
▶ 尤度: x ∼ ˆpx(1 − ˆp)N−x ただし,ˆp = 1
2
p + 1
4
.
▶ 事前分布: Uniform(0, 1)
▶ 標本数: N = 100
▶ 標本データ: x = 35
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 7 / 12
- 8. 分析の目的
PyMC3 による実装
コード 1 カンニングした学生の割合
1 import numpy as np
2 import pymc3 as pm
3
4 with pm.Model() as model:
5 p = pm.Uniform("p", lower=0, upper=1) # 事前分布の定義
6 p_hat = 0.5*p + 0.25
7 x = pm.Binomial("x", n=100, p=p_hat, observed=35) # 尤度の定義
8 trace = pm.sample(40000)
9
10 pm.traceplot(trace["p"])
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 8 / 12
- 9. 分析の目的
もう 1 つの推定方法
▶ 以上の推定方法はテキスト pp.61–62 の「もう一つの PyMC モデル」
に対応する.
▶ テキストの pp.57–60 の推定方法では,ˆp = 1
2
p + 1
4
の関係式を用い
ず,コイン投げをシュミレートすることで ˆp を計算している.
▶ observed_proportion() 関数で求めた ˆp の値を尤度の二項分布の確
率に設定している.
▶ ただし,シュミレーションで p の標本を作成する度に 100 回のコイン
投げが 2 回行われるため,計算に時間が掛かる.
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 9 / 12
- 10. 分析の目的
PyMC3 によるもう 1 つの推定方法
コード 2 カンニングした学生の割合のもう 1 つの推定方法
1 import numpy as np
2 import pymc3 as pm
3
4 with pm.Model() as model2:
5 N = 100
6 p = pm.Uniform("p", lower=0, upper=1)
7 # ここからシュミレーションで p_hat を生成
8 true_answers = pm.Bernoulli("truths", p=p, shape=N,
9 testval=np.random.binomial(1, 0.5, N))
10 first_coin_flips = pm.Bernoulli("first_flips", p=0.5, shape=N,
11 testval=np.random.binomial(1, 0.5, N))
12 second_coin_flips = pm.Bernoulli("second_flips", p=0.5, shape=N,
13 testval=np.random.binomial(1, 0.5, N))
14 observed = first_coin_flips * true_answers +
15 (1-first_coin_flips)*second_coin_flips
16 p_hat = observed.sum() / float(N)
17 # ここまで
18 x = pm.Binomial("x", n=N, p=p_hat, observed=35)
19 trace2 = pm.sample(40000)
20
21 pm.traceplot(trace2["p"])
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 10 / 12
- 11. 分析の目的
PyMC3 コードの補足
▶ 確率変数を定義する分布関数の testval 引数は,確率変数の初期値を
設定する.
▶ pm.Bernoulli() の testval 引数を指定しないと,N 個の空のデー
タで初期化される.その場合,MCMC シュミレーションがうまくいか
ない.
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 11 / 12