Contenu connexe
Similaire à 「全ての確率はコイン投げに通ず」 Japan.R 発表資料 (20)
Plus de Ken'ichi Matsui (16)
「全ての確率はコイン投げに通ず」 Japan.R 発表資料
- 18. 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コード
紫:理論的な確率
黒:乱数から生成したヒストグラム
- 26. 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コード
- 29. 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
に分割
- 32. 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コード
- 36. 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
延々と伸ばす
- 38. 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コード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
- 43. 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コード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
- 48. 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コード
赤の曲線:理論的な確率
ヒストグラム:乱数から生成
- 54. 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: 指数分布
- 59. 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: ガンマ分布
- 62. 09: 逆ガンマ分布
確率密度関数
パラメーター
f(x, ↵, ) =
↵
(↵)
x (↵+1)
exp
✓
x
◆
(0 x < 1)
単位長(時間)あたりβ回発生する指数分布のα個の和の
確率分布を考えた時、ガンマ分布となる
Xi ⇠ Exp( ) Z =
↵X
i=1
Xi ⇠ (↵, )
1/Z ⇠ IG(↵, )
この時、Zの逆数が従う分布を逆ガンマ分布と言う。
- 64. 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: 逆ガンマ分布
- 68. 10: 標準一様分布
コイン投げ
(表の確率: p) q回実施
試行結果を各桁に割り当て
表=1 裏=0 表=1 裏=0 表=1 裏=0
1回目 2回目 q回目
※ もっと効率の良いやり方もあると思いますが分かりやすさのため…
Z = x1(1/2)1
+ x2(1/2)2
+ · · · + xq(1/2)q
- 69. 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: 標準一様分布
- 74. 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: 一様分布
- 79. 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: ベータ分布