「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。

MENU

Juliaを使ってみる(05/X):確率試行のシミュレーション

1. 確率的試行のシミュレーション

1.1 Bernoulli乱数

 まずは簡単なBernoulli乱数を発生させてみる。

using Distributions

# 母数が0.5のBernoulli分布を導入
bern = Bernoulli(0.5)

# Bernoulli乱数を10個生成
X = rand(bern, 10)
print(X)

# 母数を0.9にしてみる
bern = Bernoulli(0.9)

X = rand(bern, 10)
print(X)

f:id:suguru_125:20220315192652p:plain

1.2 くじ引きのモデル化

using Distributions

##################################
### くじ引きをモデル化してみる ###
##################################

### 赤玉および青玉の入っている袋AまたはBから玉を取り出す試行をモデル化する

# 母数が0.9のBernoulli分布を導入
bern = Bernoulli(0.9)

# 関数を定義
bag(x::Bool) = x == 1 ? "A" : "B"    # 関数:引数xが1ならば"A"をそうでなければ"B"を返す
ball(y::Bool) = y == 1 ? "赤" : "青" # 関数:引数yが1ならば"赤"をそうでなければ"青"を返す

X = bag.(rand(bern, 30))

# 袋の中から赤玉または青玉を抜き出す試行
function sample()
    # 一方を引く確率は1/2
    x = bag(rand(Bernoulli(1//2))) # // はRational型を表す演算子
    
    # 袋がAならば赤玉が出る確率は1/5
    # 袋がBならば赤玉が出る確率は3/5
    mu = x == "A" ? 1//5 : 3//5      # 関数:袋が"A"ならば赤玉が出る確率として1/5, "B"ならば赤玉が出る確率は3/5
    
    # 玉の抽出
    y = ball(rand(Bernoulli(mu)))
    
    x, mu, y
end

for _ in 1:30
    x, mu, y = sample()
    println("袋: $(x), 玉: $(y)")
end

f:id:suguru_125:20220315194654p:plain

1.3 周辺確率のシミュレーション

 袋Aから取った玉が赤玉である確率P(y=赤|x=A)


\begin{aligned}
p(y=赤|x=A)&=\displaystyle{\frac{1}{5}},\\
p(y=赤|x=B)&=\displaystyle{\frac{3}{5}}
\end{aligned}

である。また袋の選択は五分五分、すなわち


\begin{aligned}
p(x=A)&=\displaystyle{\frac{1}{2}},\\
p(x=B)&=\displaystyle{\frac{1}{2}}
\end{aligned}

である。p(y=赤)は、理論的には


\begin{aligned}
p(y=赤)&=p(y=赤|x=A)p(x=A)+p(y=赤|x=B)p(x=B)\\
&=\displaystyle{\frac{1}{5}}\displaystyle{\frac{1}{2}}+\displaystyle{\frac{3}{5}}\displaystyle{\frac{1}{2}}\\
&=\displaystyle{\frac{2}{5}}=0.4
\end{aligned}

である。
 シミュレーション上は全試行数のうち発生させた試行結果のうちy=赤なものの割合を計算すればよい。

##########################
### 周辺確率を計算する ###
##########################

# P(y = "赤")を計算する
maxiter = 1000000
result = []

for _ in 1:maxiter
    x, mu, y = sample()
    push!(result, y)
end

mean(result .== "赤")
# 0.399749

f:id:suguru_125:20220315202239p:plain

1.4 ポイント

  • コンピュータによる繰り返しのシミュレーションによって確率計算が近似的に可能である。
  • 計算量を増やす程計算結果として得られる確率は理論的な厳密値に近づいていく。
  • 高次元の問題ほど計算が難しく計算量を増やさないとなかなか正解に近づかない。
  • 与えられた統計モデルの構造・性質に適した計算手法が作れれば近似精度の向上や計算量の低減が期待できる。
プライバシーポリシー お問い合わせ