全ての確率は コイン投げに通ず
2015/12/5 JapanR 発表資料 2015/12/15 基礎からのベイズ統計学輪読会 LT資料
Ken’ichi Matsui (@kenmatsu4)
自己紹介: @kenmatsu4・Facebookページ https://www.facebook.com/matsukenbook ・Twitterアカウント @kenmatsu4 ・Qiitaでブログを書いています(統計、機械学習、Python等) http://qiita.com/kenmatsu4 (4600 contributionを超えました!)
・趣味 - バンドでベースを弾いたりしています。 - 主に東南アジアへバックパック旅行に行ったりします (カンボジア、ミャンマー、バングラデシュ、新疆ウイグル自治区 etc) 旅行の写真 : http://matsu-ken.jimdo.com
Twitterアイコン
Pythonタグで1位に なりました!(>∀<人)
http://goo.gl/yxNJgQ
http://goo.gl/JNPfv3
http://goo.gl/0Tqgrd
http://www.slideshare.net/matsukenbook
本題です。
http://nbviewer.ipython.org/github/bakfoo/pyconjp/blob/master/probprog3.ipynb
結局,確率的プログラミングにおいて,プログラマがやることは, • データを用意する • パラメータの種類を決め,確率分布を決める • パラメータ込みで事前分布を数式で表す • パラメータ込みで尤度を数式で表す • MCMCサンプリング法を選ぶ あとは計算機がMCMCサンプリングをして,パラメータの推定値を返す. 結局,事前分布や尤度の確率分布を上手にモデリングするには, 確率分布とその確率分布の関係をよく知っていなければならない.
柏野さん@PyconJP
なるほど!
そこで紹介されていたのが、
これ!
http://www.math.wm.edu/~leemis/2008amstat.pdf
多いな! ((((;゚Д゚)))))))
これ!
http://www.math.wm.edu/~leemis/2008amstat.pdf
多いな! ((((;゚Д゚)))))))
76個あります
5分間で出来る限り 説明してみます!(`・ω・́)
今日はそのうち12個!
Let’s Start!!!
1/76 ベルヌーイ分布 Bernoulli Distribution
01: ベルヌーイ分布
表は1 裏は0
試行を1度行い、成功か失敗など2値例:コイン投げ
確率関数
P (X = x) = p
x(1� p)1�x
(x = 0, 1)
パラメーターp:1 (表) が出る確率
01: ベルヌーイ分布
# ベルヌーイ分布からのサンプリングを実行
# パラメーター p = 0.7 trial_size = 10000 set.seed(71)
# ベルヌーイ分布に従う乱数生成 data <-‐ rbern(trial_size, p)
# ベルヌーイ分布の確率分布 dens <-‐ data.frame(y=c((1-‐p),p)*trial_size, x=c(0, 1))
# グラフ描画 ggplot() + layer(data=data.frame(x=data), mapping=aes(x=x), geom="bar", stat="bin", bandwidth=0.1 ) + layer(data=dens, mapping=aes(x=x, y=y), geom="bar", stat="identity", width=0.05, fill="#777799", alpha=0.7)
Rコード
紫:理論的な確率 黒:乱数から生成したヒストグラム
ここで、 もう一度タイトルを
全ての確率は コイン投げに通ず
2015/12/5 JapanR 発表資料
Ken’ichi Matsui (@kenmatsu4)
全ての確率は コイン投げに通ず
2015/12/5 JapanR 発表資料
Ken’ichi Matsui (@kenmatsu4)
これから、このコイン投げ (ベルヌーイ分布)を起点として
様々な確率分布に従う 乱数を作っていきます。
2/76 二項分布 Binomial Distribution
02: 二項分布
ベルヌーイ試行をn回実施し、何回成功したかの回数 を確率変数とした分布。
例:フリースロー 1セット30回実施。 1回あたりの成功率70%で計何回入ったか
確率関数
パラメーター
p:1 (表) が出る確率 [フリースローの成功確率]
P (X = x) =n
C
r
p
x(1� p)n�x
n:1セットあたりの回数
(x = 1, 2, · · · , n)
02: 二項分布
n回実施
表の出た回数 x
コイン投げ(表の確率: p)
02: 二項分布
# パラメーター p = 0.7 trial_size = 10000 sample_size = 30 set.seed(71)
# ベルヌーイ分布に従う乱数生成 gen_binom_var <-‐ function() { return(sum(rbern(sample_size, p))) } result <-‐ rdply(trial_size, gen_binom_var())
# 二項分布の密度関数 dens <-‐ data.frame(y=dbinom(seq(sample_size), sample_size, 0.7))*trial_size
# グラフ描画 ggplot() + layer(data=resuylt, mapping=aes(x=V1), geom="bar", stat = "bin", binwidth=1, fill="#6666ee", color="gray" ) + layer(data=dens, mapping=aes(x=seq(sample_size)+.5, y=y), geom="line", stat="identity", position="identity",colour="red" ) + ggtitle("Bernoulli to Binomial.")
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
Rコード
3/76 ポワソン分布 Poisson Distribution
03: ポワソン分布1セット回数 n → ∞ 、1回あたり成功率 p → 0 npを一定とした時の分布例:棒の傷のチェックを考える。1cm幅で傷の有無を を調べる。ベルヌーイ試行の繰り返し → 二項分布 → 無限に分割してポアソン分布。
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
10cm 全部で傷が7つ
0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm 0.5cm
∞ に分割
確率関数
パラメーター
この例の場合、棒一本あたりの傷の平均的な数λ:平均生起回数
P (X = x) =e
��
�
x
x!(x = 1, 2, · · · ,1)
( λ = np の関係が保たれている)
棒1本あたりの傷の数 の分布→ポアソン分布
上限がなくなった!
03: ポアソン分布
n回実施
03: ポアソン分布コイン投げ(表の確率: p)
np一定で n→∞
03: ポアソン分布
trial_size = 5000; width <-‐ 1; # もともとの問題設定 p = 0.7; n = 10; np <-‐ p*n # n→∞、p→0、np=一定 n = 100000; p <-‐ np/n
# ベルヌーイ分布に従う乱数生成 gen_binom_var <-‐ function() { return(sum(rbern(n, p))) } result <-‐ rdply(trial_size, gen_binom_var())
# ポアソン分布の密度関数 dens <-‐ data.frame(y=dpois(seq(20), np))*trial_size
# グラフ描画 ggplot() + layer(data=result, mapping=aes(x=V1), geom="bar", stat = "bin", binwidth=width, fill="#6666ee", color="gray" ) + layer(data=dens, mapping=aes(x=seq(20)+.5, y=y), geom="line", stat="identity", position="identity", colour="red" ) + ggtitle("Bernoulli to Poisson.")
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
Rコード
4/76 正規分布 Normal Distribution
04: 正規分布
二項分布のnを大きくすると正規分布で近似できる。
確率密度関数
パラメーター
σ:標準的偏差μ:平均値
f(x) =
1p2⇡�
2exp
⇢�1
2
(x� µ)
2
�
2
�
(�1 < x < 1)
例:死ぬまでフリースロー投げて計何回入ったか
04: 正規分布 (ポアソン分布との違い)
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
10cm
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
20cm
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
…
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
→ ∞ cm
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
延々と伸ばす
n回実施コイン投げ(表の確率: p)
n → ∞
04: 正規分布
04: 正規分布
# パラメーター n <-‐ 10000; p <-‐ 0.7; trial_size = 10000 width=10
# ベルヌーイ分布に従う乱数生成 gen_binom_var <-‐ function() { return(sum(rbern(n, p))) } result <-‐ rdply(trial_size, gen_binom_var())
# 正規分布の密度関数 dens <-‐ data.frame(y=dnorm(seq(6800,7200), mean=n*p, sd=sqrt(n*p*(1-‐p)))*trial_size*width)
# グラフ描画 ggplot() + layer(data=result, mapping=aes(x=V1), geom="bar", stat = "bin", binwidth=width, fill="#6666ee", color="gray" ) + layer(data=dens, mapping=aes(x=seq(6800,7200), y=y), geom="line", stat="identity", position="identity", colour="red") + ggtitle("Bernoulli to Normal.")
Rコード
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
5/76 標準正規分布 Standard Normal Distribution
05: 標準正規分布
正規分布を平均0、標準偏差1にしたもの
確率密度関数
パラメーターなし
(�1 < x < 1)
f(x) =
1p2⇡
exp
⇢�1
2
x
2
�
n回実施コイン投げ(表の確率: p)
n → ∞
05: 標準正規分布
平均を0にずらす
標準偏差を1に 縮める
05: 標準正規分布
# パラメーター n <-‐ 10000; p <-‐ 0.7 trial_size = 30000 width=0.18
# ベルヌーイ分布に従う乱数生成 gen_binom_var <-‐ function() { return(sum(rbern(n, p))) } result <-‐ rdply(trial_size, gen_binom_var()) m <-‐ mean(result$V1); sd <-‐ sd(result$V1); result <-‐ (result -‐ m)/sd
# 標準正規分布の密度関数 dens <-‐ data.frame(y=dnorm(seq(-‐4,4,0.05), mean=0, sd=1)*trial_size*width)
# グラフ描画 ggplot() + layer(data=result, mapping=aes(x=V1), geom="bar", stat = "bin", binwidth=width, fill="#6666ee", color="gray" ) + layer(data=dens, mapping=aes(x=seq(-‐4,4,0.05), y=y), geom="line", stat="identity", position=“identity", colour="red" ) + ggtitle("Bernoulli to Standard Normal.")
Rコード
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
6/76 カイ二乗分布 Chi Square Distribution
06: カイ二乗分布標準正規分布に従う確率変数 を2乗してk個 足し合わせた が従う分布確率密度関数
パラメーターk:自由度 (2乗した標準正規分布の確率変数の 足し合わせた数)
f(x, k) =(1/2)k/2
�(k/2)x
k/2�1e
�x/2
(0 x)
Xi
Z = X21 + · · ·+X2
k
平均を0にずらす
n回実施コイン投げ(表の確率: p)
n → ∞
06: カイ二乗分布
平均を0にずらす
標準偏差を1に 縮める
平均を0にずらす
k=1のとき
二乗したところに積んでいく
k=3のとき
k=3つ サンプリングする
k=3つの長さを 足したものを プロットする
05: カイ二乗分布
# パラメーター p <-‐ 0.7; n <-‐ 1000; trial_size <-‐ 100000; width <-‐ 0.3; df <-‐ 3 # ベルヌーイ分布に従う乱数生成(3まわし) gen_binom_var <-‐ function() { return(sum(rbern(n, p))) } gen_chisq_var <-‐ function() { result <-‐ rdply(trial_size, gen_binom_var()) return(((result$V1 -‐ mean(result$V1))/sd(result$V1))**2) } # 自由度dfの分だけ生成する result <-‐ rlply(df, gen_chisq_var(),.progress = "text") res <-‐ data.frame(x=result[[1]] + result[[2]] + result[[3]]) # カイ二乗分布の密度関数(自由度=3) xx <-‐ seq(0,20,0.1) dens <-‐ data.frame(y=dchisq(x=xx, df=df)*trial_size*width) # グラフ描画 ggplot() + layer(data=data, mapping=aes(x=x), geom="bar", stat = "bin", binwidth=width, fill="#6666ee", color="gray" ) + layer(data=dens, mapping=aes(x=xx, y=y), geom="line", stat="identity", position="identity", colour="blue" ) + ggtitle("Bernoulli to Chisquare")
Rコード
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
7/76 指数分布 Exponential Distribution
07: 指数分布ポアソン分布が単位長(もしくは単位時間)に平均 何回生起するか、を表す分布であったが、同じ事象 を違う角度で捉え直したのが指数分布。
1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm 1cm
10cm 全部で傷が7つポアソン分布的考え方
指数分布的考え方
次発生するまでに、どのくらいの距離(時間)か
07: 指数分布
確率密度関数
パラメーター
λ:単位長(時間)に平均的に生起する回数
f(x,�) =
⇢�e
��x (x � 0)0 (x < 0)
n回実施コイン投げ(表の確率: p)
np一定で n→∞
07: 指数分布
平均を0にずらす
間隔の長さをプロット
trial_size = 7000; width <-‐ .01; # もともとの問題設定 p = 0.7; n = 10; np <-‐ p*n; # n→∞、p→0、np=一定 n = 10000; p <-‐ np/n # ベルヌーイ分布に従う乱数生成 gen_exp_var <-‐ function() { cnt <-‐ 0 while (TRUE) { cnt <-‐ cnt + 1 if (rbern(1, p)==1){ return(cnt) # 1が出たらそれが何回目かを返す } } } data <-‐ data.frame(x=rdply(trial_size, gen_exp_var())/n) names(data) <-‐ c("n", "x") # 指数分布の密度関数 dens <-‐ data.frame(y=dexp(seq(0, 1.5, 0.1), np)*trial_size*width) ggplot() + layer(data=data, mapping=aes(x=x), geom="bar", stat = "bin", binwidth=width, fill="#6666ee", color="gray" ) + layer(data=dens, mapping=aes(x=seq(0, 1.5, 0.1), y=y), geom="line", stat="identity", position="identity", colour="red" ) + ggtitle("Bernoulli to Exponential.")
Rコード
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
07: 指数分布
8/76 ガンマ分布 Gamma Distribution
08: ガンマ分布
確率密度関数
パラメーター単位長(時間)あたりβ回発生する指数分布の α個の和の確率分布を考えた時、ガンマ分布となる
f(x,↵,�) =
�
↵
�(↵)
x
↵�1exp(��x)
(0 x < 1)
↵X
i=1
Xi ⇠ �(↵,�)Xi ⇠ Exp(�)
n回実施コイン投げ(表の確率: p)
np一定で n→∞
平均を0にずらす
08: ガンマ分布
間隔の長さをプロット
k=5つの長さを 足したものを プロットする
k=5つサンプリング
trial_size = 7000; width <-‐ .035; # もともとの問題設定 p = 0.7; n = 10; np <-‐ p*n; # n→∞、p→0、np=一定 n = 10000; p <-‐ np/n; alpha <-‐ 5 # ベルヌーイ分布に従う乱数生成 get_interval <-‐ function(){ cnt <-‐ 0 while (TRUE) { cnt <-‐ cnt + 1 if (rbern(1, p)==1){ return(cnt) } } } gen_exp_var <-‐ function() { data <-‐ data.frame(x=rdply(trial_size, get_interval())/n) names(data) <-‐ c("n", "x") return(data) } result <-‐ rlply(alpha, gen_exp_var()) data <-‐ data.frame(x=result[[1]]$x + result[[2]]$x + result[[3]]$x + result[[4]]$x + result[[5]]$x) # ガンマ分布の密度関数 dens <-‐ data.frame(y=dgamma(seq(0, 3,.01), shape=alpha, rate=np)*trial_size*width) ggplot() + layer(data=data, mapping=aes(x=x), geom="bar", stat = "bin", binwidth=width, fill="#6666ee", color="gray" ) + layer(data=dens, mapping=aes(x=seq(0,3,.01), y=y), geom="line", stat="identity", position="identity", colour="red" ) + ggtitle("Bernoulli to Gamma") Rコード
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
08: ガンマ分布
9/76 逆ガンマ分布 Inverse Gamma Distribution
09: 逆ガンマ分布
確率密度関数
パラメーター
f(x,↵,�) =
�
↵
�(↵)
x
�(↵+1)exp
✓�
x
◆
(0 x < 1)
単位長(時間)あたりβ回発生する指数分布のα個の和の 確率分布を考えた時、ガンマ分布となる
Xi ⇠ Exp(�) Z =↵X
i=1
Xi ⇠ �(↵,�)
1/Z ⇠ IG(↵,�)この時、Zの逆数が従う分布を逆ガンマ分布と言う。
平均を0にずらす
n回実施コイン投げ(表の確率: p)
np一定で n→∞
平均を0にずらす
間隔の長さをプロット
09: 逆ガンマ分布
k=5つの長さを 足したものを プロットする
k=5つ サンプリング
全てのデータをy=1/x で変換
z
z
ww
trial_size = 7000; width <-‐ .; # もともとの問題設定 p = 0.7; n = 10; np <-‐ p*n; # n→∞、p→0、np=一定 n = 10000; p <-‐ np/n; alpha <-‐ 5 # ベルヌーイ分布に従う乱数生成 get_interval <-‐ function(){ cnt <-‐ 0 while (TRUE) { cnt <-‐ cnt + 1 if (rbern(1, p)==1){ return(cnt) } } } gen_exp_var <-‐ function() { data <-‐ data.frame(x=rdply(trial_size, get_interval())/n) names(data) <-‐ c("n", "x") return(data) } result <-‐ rlply(alpha, gen_exp_var()) data <-‐ data.frame(x=1/(result[[1]]$x + result[[2]]$x + result[[3]]$x + result[[4]]$x + result[[5]]$x)) # 逆ガンマ分布の密度関数 dens <-‐ data.frame(y=dinvgamma(seq(0, 23,.01), shape=5, rate=1/np)*trial_size*width) ggplot() + layer(data=data, mapping=aes(x=x), geom="bar", stat = "bin", binwidth=width, fill="#6666ee", color="gray" ) + layer(data=dens, mapping=aes(x=seq(0,3,.01), y=y), geom="line", stat="identity", position="identity", colour="red" ) + ggtitle("Bernoulli to Inversegamma") Rコード
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
09: 逆ガンマ分布
10/76 標準一様分布 Standard Uniform Distribution
10: 標準一様分布
確率密度関数
パラメーター
なし
0から1の間で等確率で発生するような現象を 表す分布
f(x) =
⇢1 (0 x 1)
0 (otherwise)
10: 標準一様分布コイン投げ(表の確率: p) q回実施
試行結果を各桁に割り当て
表=1 裏=0 表=1 裏=0 表=1 裏=01回目 2回目 q回目
※ もっと効率の良いやり方もあると思いますが分かりやすさのため…
Z = x1(1/2)1 + x2(1/2)
2 + · · ·+ xq(1/2)q
width <-‐ 0.02 p <-‐ 0.5; sample_size <-‐ 1000 trial_size <-‐ 100000
gen_unif_rand <-‐ function() { # sample_size桁の2進少数をベルヌーイ分布に
# 従う乱数から生成 return (sum(rbern(sample_size, p) * (rep(1/2, sample_size) ** seq(sample_size)))) }
gen_rand <-‐ function(){ return( rdply(trial_size, gen_unif_rand()) ) } system.time(res <-‐ gen_rand())
ggplot() + layer(data=res, mapping=aes(x=V1), geom="bar", stat = "bin", binwidth=width, fill="#6666ee", color="gray" ) + ggtitle("Bernoulli to Standard Uniform")
Rコード
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
10: 標準一様分布
11/76 一様分布 Standard Uniform Distribution
確率密度関数
パラメーター
a:下限b:上限
f(x, a, b) =
⇢(b� a)
�1(a x b)
0 (otherwise)
aからbの間では等確率で発生するような現象を 表す分布
11: 一様分布
コイン投げ(表の確率: p)
q回実施11: 一様分布
平行移動と引き延ばし
a <-‐ 5 b <-‐ 8; width <-‐ 0.05 p <-‐ 0.5 sample_size <-‐ 1000 trial_size <-‐ 500000
gen_unif_rand <-‐ function() { # sample_size桁の2進少数をベルヌーイ分布に
# 従う乱数から生成 return (sum(rbern(sample_size, p) * (rep(1/2, sample_size) ** seq(sample_size)))) }
gen_rand <-‐ function(){ return( rdply(trial_size, gen_unif_rand()) ) } system.time(res <-‐ gen_rand()) res$V1 <-‐ res$V1 * (b-‐a) + a
ggplot() + layer(data=res, mapping=aes(x=V1), geom="bar", stat = "bin", binwidth=width, fill="#6666ee", color="gray" ) + ggtitle("Bernoulli to Uniform") + xlim(4,9)
Rコード
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
11: 一様分布
12/76 ベータ分布 Beta Distribution
12: ベータ分布
確率密度関数
パラメーターα:並べ替えたあとのサンプリングするポジションβ:同じくポジションだが、後ろから数えたときのもの
f(x,↵,�) =1
B(↵,�)x
↵�1(1� x)��1
(0 < x < 1)
独立に標準一様分布に従う (α+β-1) 個の確率変数
を大きさの順に並べ替えたとき、小さい方から α番め(大きい方からは β番目)の確率変数 X の分布がベータ分布 B(α,β) となる。
→ B(・)はベータ関数
Xi ⇠ U(0, 1)iid (i = 1, 2, · · · ,↵+ � � 1)
… …α個
β個
コイン投げ(表の確率: p)
q回実施12: ベータ分布
大きさの順に並べて 2つめの値をプロット
3つサンプリング
width <-‐ 0.03; p <-‐ 0.5 digits_length <-‐ 30; set_size <-‐ 3 trial_size <-‐ 30000 gen_unif_rand <-‐ function() { # digits_length桁の2進少数をベルヌーイ分布
# に従う乱数から生成 return (sum(rbern(digits_length, p) * (rep(1/2, digits_length) ** seq(digits_length)))) } gen_rand <-‐ function(){ return( rdply(set_size, gen_unif_rand())$V1 ) }
unif_dataset <-‐ rlply(trial_size, gen_rand, .progress='text') p <-‐ ceiling(set_size * 0.5); q <-‐ set_size -‐ p + 1 get_nth_data <-‐ function(a){ return(a[order(a)][p]) } disp_data <-‐ data.frame(lapply(unif_dataset, get_nth_data)) names(disp_data) <-‐ seq(length(disp_data)); disp_data <-‐ data.frame(t(disp_data)) names(disp_data) <-‐ "V1" x_range <-‐ seq(0, 1, 0.001)
dens <-‐ data.frame(y=dbeta(x_range, p, q)*trial_size*width) ggplot() + layer(data=disp_data, mapping=aes(x=V1), geom="bar", stat = "bin", binwidth=width, fill="#6666ee", color="gray" ) + layer(data=dens, mapping=aes(x=x_range, y=y), geom="line", stat="identity", position="identity", colour="red" ) + ggtitle("Bernoulli to Beta") Rコード
赤の曲線:理論的な確率 ヒストグラム:乱数から生成
12: ベータ分布
To be continued…
参考このスライドのRのコード https://gist.github.com/matsuken92/671ae282429d6ad97aec
工科系のための統計概論 http://www.amazon.co.jp/dp/4563008168
指数分布とポアソン分布のいけない関係 http://www.slideshare.net/teramonagi/ss-11296227
ベータ分布の性質 http://www.kwansei.ac.jp/hs/z90010/sugakuc/toukei/beta/beta.htm