LoginSignup
0
1

More than 1 year has passed since last update.

ディリクレ分布から乱数を取得する

Last updated at Posted at 2021-11-18

ベータ分布の定義

確率密度関数が

f(x) = Beta(x|a,b)= Cx^{a-1}(1-x)^{b-1} (0 \le x \le 1)



であるような一変量の確率分布。

ディリクレ分布の定義

確率密度関数が

f(x_1,...,x_{n-1}, x_n)= Dir(x_1,...,x_n|\alpha_1,...,\alpha_{n-1}) = Cx^{\alpha_{1}-1}\cdots x_n^{\alpha_n -1} (x_1,...,x_n \ge 0), 



であるような多変量の確率分布をディリクレ分布と呼ぶ。ただし、$C$は正規化定数($x_1 + ...+x_n = 1$にするためにかけるもの)・$\alpha$はパラメータである。

ディリクレ分布の解釈

ベータ分布(コイントスにおいて表が出る確率の予測の分布)を多次元に拡張したもの。つまり、ディリクレ分布において、$n=2$の場合(単変量)を考えると、

f(x_1,1-x_1) = Cx_1^{\alpha_1 -1}(1 - x_1)^{\alpha_2 -1}, x_2 = 1 - x_1

となりベータ分布の確率密度関数となる。

ディリクレ分布をサイコロの目の出やすさの分布と捉える

サイコロを何度も投げて各目の出やすさを推し量るイメージを持つ。三面サイコロで考える場合、確率密度関数は


f(x_1,x_2,x_3) = Dir(X | \alpha) = Cx_1^{\alpha_1-1}x_2^{\alpha_2-1}x_3^{\alpha_3 -1}



となる。$X = (x_1,x_2,x_3)$は各目の出る確率を、$\alpha = (\alpha_1, \alpha_2, \alpha_3)$は各目の実際に出た回数+1を表している。$X = (x_1,x_2,x_3)$の組み合わせは無限にあるが、実際の観測値(パラメータ)により、あり得そうな出やすさの組み合わせとそうでないものが出てくる。直感的には、各組合せの候補がどれくらい統計的に有力なのかを表したものとして$Dir(X|\alpha)$を捉えることができる。

scipyとnumpyを用いてPDFを計算および乱数を取得

from scipy.stats import dirichlet

#三面サイコロを30回振って各目が10回ずつ出た場合

```python
from scipy.stats import dirichlet

print(dirichlet.pdf(x=(0.333, 0.333,0.334), alpha = (11,11,11)))
print(dirichlet.pdf(x=(0.25, 0.25,0.50), alpha = (11,11,11)))

26.744346275061304
4.890833353429621

import numpy as np

#3次元ディリクレ分布から二次元配列を作成
a = np.random.dirichlet(alpha = (11,11,11), size =3)
a

array([[0.31927048, 0.40265028, 0.27807924],
       [0.45294397, 0.20323626, 0.34381977],
       [0.21744933, 0.43121254, 0.35133813]])

実測値から各目の出やすさの組み合わせとして$[0.33,0.33,0.34]$あたりが最も高い確率密度を取ることが予想でき、実際に外れ値的な各目の出やすさは確認されなかった。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1