Generator.gamma – ガンマ分布から乱数配列を作成する方法

Generator.gammaは、ガンマ分布から乱数配列を生成するジェネレータメソッドです。

ガンマ分布とは、簡単に言うと、ある一定の期間に1回起こるランダムな事象がn回起こるまでの時間の分布を示したものです。たとえば、電子部品の寿命の分布や、通信の待ち時間の分布などに使われます。

このページでは、このGenerator.gammaメソッドについて解説します。

目次

1. 書式

Generator.gamma

書き方:

Generator.gamma(shape, scale=1.0, size=None)

パラメーター:

shape: float or array_like of floats
ガンマ分布の形状を指定する。負の数は不可。値が大きいほど正規分布に近づく。※ガンマ分布ではshape * scale = mean(平均値)
scale: float or array_like of floats, optional
ガンマ分布のスケール(縮尺)を指定する。負の値は付加。デフォルトは1.0。※ガンマ分布ではshape * scale = mean(平均値)
size: int or tuple of ints, optional
出力する配列のshapeを指定する。デフォルト値のNoneの場合で、かつ、shapeとscaleがともにスカラーの場合、1つの乱数の値を返す。それ以外の場合は、np.broadcast(shape, scale).sizeの乱数を生成する。(参考:『NumPyのshape属性 – 配列の形状の確認と変更』)

戻り値: 

out: ndarray or scalar
指定した範囲のガンマ分布からの乱数を出力する。

一緒に確認したい関数:

  • scipy.stats.gamma: 確率密度関数や累積分布関数など

2. サンプルコード

それでは、サンプルコードを見ていきましょう。

まずは、random.default_rng コンストラクタでジェネレータオブジェクトを作成します。『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』に目を通しておいてください。

In [1]:
import numpy as np
rng = np.random.default_rng()
rng
Out[1]:
Generator(PCG64) at 0x7FB7D5A6BD68

こうして作成したジェネレータオブジェクト rng に対して、Generator.gammaを呼び出します。その際、第一引数にガンマ分布のshape、第二引数にscale、第三引数にsizeを指定します。

なお、ガンマ分布では、shape * scale = meanです。

shapeとscaleのみを指定すると、その分布から乱数を1つ取得します。

In [2]:
rng.gamma(2., 2.)
Out[2]:
0.7724500236959687

第三引数で出力する配列のsizeを指定します。

In [3]:
rng.gamma(2., 2., 5)
Out[3]:
array([4.59528275, 3.84465933, 0.64493992, 4.49184075, 5.22944991])

なおガンマ分布では、第一引数のshapeが大きいほど、正規分布に近くなります。そしてscaleが大きいほど広がりが大きくなります。

以下でいくつか描画しておきます。

In [4]:
import matplotlib.pyplot as plt
import scipy.special as sps  

plt.subplot(221)
shape, scale = 2., 2.
s = rng.gamma(shape, scale, 10000)
count, bins, ignored = plt.hist(s, 50, density=True)
y = bins**(shape-1)*(np.exp(-bins/scale) /  
                     (sps.gamma(shape)*scale**shape))
plt.plot(bins, y, linewidth=2, color='r')  
plt.title('shape=2., scale=2.', fontsize=12)

plt.subplot(222)
shape, scale = 2., 4.
s = rng.gamma(shape, scale, 10000)
count, bins, ignored = plt.hist(s, 50, density=True)
y = bins**(shape-1)*(np.exp(-bins/scale) /  
                     (sps.gamma(shape)*scale**shape))
plt.plot(bins, y, linewidth=2, color='r')  
plt.title('shape=2., scale=4.', fontsize=12)

plt.subplot(223)
shape, scale = 10., 2.
s = rng.gamma(shape, scale, 10000)
count, bins, ignored = plt.hist(s, 50, density=True)
y = bins**(shape-1)*(np.exp(-bins/scale) /  
                     (sps.gamma(shape)*scale**shape))
plt.plot(bins, y, linewidth=2, color='r') 
plt.title('shape=10., scale=2.', fontsize=12)

plt.subplot(224)
shape, scale = 20., 2.
s = rng.gamma(shape, scale, 10000)
count, bins, ignored = plt.hist(s, 50, density=True)
y = bins**(shape-1)*(np.exp(-bins/scale) /  
                     (sps.gamma(shape)*scale**shape))
plt.plot(bins, y, linewidth=2, color='r')  
plt.title('shape=20., scale=2.', fontsize=12)

plt.tight_layout()
plt.show()

3. まとめ

以上のように、Generator.gammaはガンマ分布から乱数配列を生成するジェネレータメソッドです。

これまで使われていたnp.random.gamma関数は継続して使用可能ですが、Generator.gammaメソッドを使った方が遥かに高速で科学技術計算に適しています。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる