狠狠撸

狠狠撸Share a Scribd company logo
第 2 章 例題: カンニングした学生の割合
市東 亘
西南学院大学 経済学部
July 15, 2019
講義ノート: https://courses.wshito.com/semi2/2019-bayes-AI
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 1 / 12
概観
概観
テキスト「Python で体験するベイズ推論」pp.57–62
例題: カンニングをした学生の割合
? 分析の背後にある統計モデルを理解する.
? PyMC3 による実装方法を学ぶ.
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 2 / 12
分析の目的
分析の目的
目的
? 個人を特定できない方法でカンニングをしたか否かの標本を構築する.
? Privacy Algorithm
? 構築した標本から,母集団のカンニング割合をベイズ推定する.
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 3 / 12
分析の目的
Privacy Algorithm
母集団
カンニング
カンニングなし
コイン投げ
サンプリング
表
裏
正直に回答
コイン投げ
表
裏
カンニングと回答
カンニングしてい
ないと回答
カンニング
カンニング
してない
観測可能な標本
カンニングしている人
の分布割合 = p
?p
1
2 p
1
2 (1 ? p)
1
4
1
4
N 人人
?コイン投げの結果は観測できない.
?我々が知りたいのは ? の事後分布.
?観測データから得られるのは? .?p
p
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 4 / 12
分析の目的
統計モデルの構築
? 我々が知りたいのは p の事後分布: f(p|D) ∝ f(D|p)f(p)
? 事前分布 f(p) は「理由不十分の原則」から一様分布を採用.
? 尤度 f(D|p) をどのように定義するか?
? 尤度はデータが与えられた時,その事象が生起する確率を求めるのに
使用する密度関数の式を,パラメータが所与でデータを変数と読み替
えたもの.
? したがって「カンニング」と回答したデータが得られた時,そのデー
タが得られる確率を計算する密度関数を尤度に指定する.
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 5 / 12
分析の目的
統計モデルの構築: 尤度の定義
? 尤度に与えるデータは何か?カンニングしたか否かの個別データ?
? 回答の順番に意味はない!カンニング総数だけが意味を持つ!
? したがって使用する標本データはカンニング数 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
分析の目的
ベイズモデル
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
分析の目的
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
分析の目的
もう 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
分析の目的
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
分析の目的
PyMC3 コードの補足
? 確率変数を定義する分布関数の testval 引数は,確率変数の初期値を
設定する.
? pm.Bernoulli() の testval 引数を指定しないと,N 個の空のデー
タで初期化される.その場合,MCMC シュミレーションがうまくいか
ない.
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 11 / 12
分析の目的
パラメータの事後分布
市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 12 / 12

More Related Content

2019年 演習II.第2章 例題: カンニングした学生の割合

  • 1. 第 2 章 例題: カンニングした学生の割合 市東 亘 西南学院大学 経済学部 July 15, 2019 講義ノート: https://courses.wshito.com/semi2/2019-bayes-AI 市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 1 / 12
  • 2. 概観 概観 テキスト「Python で体験するベイズ推論」pp.57–62 例題: カンニングをした学生の割合 ? 分析の背後にある統計モデルを理解する. ? PyMC3 による実装方法を学ぶ. 市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 2 / 12
  • 3. 分析の目的 分析の目的 目的 ? 個人を特定できない方法でカンニングをしたか否かの標本を構築する. ? Privacy Algorithm ? 構築した標本から,母集団のカンニング割合をベイズ推定する. 市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 3 / 12
  • 4. 分析の目的 Privacy Algorithm 母集団 カンニング カンニングなし コイン投げ サンプリング 表 裏 正直に回答 コイン投げ 表 裏 カンニングと回答 カンニングしてい ないと回答 カンニング カンニング してない 観測可能な標本 カンニングしている人 の分布割合 = p ?p 1 2 p 1 2 (1 ? p) 1 4 1 4 N 人人 ?コイン投げの結果は観測できない. ?我々が知りたいのは ? の事後分布. ?観測データから得られるのは? .?p p 市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 4 / 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
  • 12. 分析の目的 パラメータの事後分布 市東 亘 (西南学院大学 経済学部) 第 2 章 例題: カンニングした学生の割合 July 15, 2019 12 / 12