Generator.dirichletは、NumPyでディリクレ分布から乱数配列を生成するための、randomモジュールのジェネレータメソッドです。
ディリクレ分布はベータ分布を多変量に拡張した分布と考えることができ、ベイズ推定における多項分布の共役事前分布であることが知られています。
このページでは、このGenerator.dirichletについて解説します。なお、同じ操作をするのに今までは、np.random.dirichlet関数を使っていましたが、現在ではGenerator.dirichletが推奨されています。
1. 書式
書き方:
Generator.dirichlet(alpha, size=None)
パラメーター:
alpha: sequence of floats, length k 分布のパラメータ。length k は標本の長さk。 |
size: int or tuple of ints, optional 出力する配列のshapeを指定。デフォルトのNoneでは、長さkのベクトルを返す。 |
戻り値:
samples: ndarray shape(size, k)の乱数 |
例外:
ValueError alphaに0以下の値が含まれている場合 |
2. サンプルコード
まずは、random.default_rng コンストラクタでジェネレータオブジェクトを作成します。『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』に目を通しておいてください。
import numpy as np
rng = np.random.default_rng()
rng
こうして作成したジェネレータオブジェクト rng に対して、Generator.diricletを呼び出します。その際、第一引数にalpha、第二引数にsizeを渡します。
sizeを指定しない場合は、alphaの長さkの配列を返します。
alpha = [5., 5., 5.]
rng.dirichlet(alpha)
sizeを指定すると、(size, k)の2次元配列を返します。
rng.dirichlet(alpha, 5)
ディリクレ分布のパラメータの直感的な理解を助ける例として、長さ1.0の紐をハサミで切って、異なる長さのK本の紐にするというものがあります。ここでは3本にするとして、それぞれ長さが指定されているとします。これを定規を使わずに、指定の長さになるように感覚的に切っていきます。
これを20回行ったとしたら、実際の紐の長さは確率的に次のようになります。
import matplotlib.pyplot as plt
s = rng.dirichlet((10, 5, 3), 20).transpose()
plt.barh(range(20), s[0])
plt.barh(range(20), s[1], left=s[0], color='g')
plt.barh(range(20), s[2], left=s[0]+s[1], color='r')
plt.title("Lengths of Strings")
3. まとめ
以上のように、Generator.diricletはディリクレ分布から乱数配列を生成するジェネレータメソッドです。
これまで使われていたnp.random.diriclet関数は継続して使用可能ですが、Generator.diricletメソッドを使った方が遥かに高速で科学技術計算に適しています。
コメント