実務でデータ解析や機械学習のコードを書くなり調査したりしていると、特定の乱数を生成したくなる場面に毎日のように遭遇すると思います。
その都度ネットでググって、コードに打ち込んだ次の瞬間には忘却しているような気がしているので、今回は備忘録も含めてPythonのNumpyライブラリーのrandomモジュールで生成できる乱数生成の方法について整理します。
注意事項として、本記事で扱っている乱数生成のライブラリはnumpyのrandomモジュールであり、Pythonの処理系に含まれている標準ライブラリrandomではないことに注意してください。
- Numpyでのrandomモジュールで生成できる乱数をまとめ
- 確率分布に従って生成できる乱数一覧
Numpyのバージョン
今回利用した、numpyのバージョンは1.21.6 ですが、今回まとめたようなNumpyのrandomモジュールの基本的な乱数生成の関数は、かなり前のバージョンから実装されているはずなので、基本的に動作すると思いますが、もし動作しない場合は、numpyをバージョンアップするなりしてみてください。
import numpy as np
np.__version__
# '1.21.6'
基本的な乱数生成の関数
random.random 0.0以上1.0未満の浮動小数点 を生成
np.random.random()
# 0.11940799291206616
浮動小数点数数を1つ生成することができました。
random関数だけでなく、numpyのrandomモジュールの多くの関数は、sizeオプションを指定することで、下記のように指定した個数分の複数個乱数を生成し、配列で取得することもできます。
np.random.random(size=5)
# array([0.59146092, 0.72564563, 0.86329765, 0.58936376, 0.56760505])
random.uniform(a, b) 指定範囲内の浮動小数点の乱数を生成
指定した範囲内の、浮動小数点を生成するには、random.uniform(a, b)を利用します。
a, b はそれぞれ範囲指定における、下限と上限に相当します。random.uniform(a, b)で生成できるのは、浮動小数点なので、整数値を生成したい場合は、次のrandintを利用します。
np.random.uniform(1, 5)
# 2.6269304786848604
random.randint(a, b) 指定範囲内の整数値の乱数を生成
random.randint(a, b) を用いると、指定範囲内の、整数値$n$を生成できます。
ここで、$a \leq n < b$と、生成される乱数$n$は、aは含み、 bは含まないことに注意してください。
np.random.randint(1, 10)
# 2
10個の乱数をランダムに生成する場合はこのようになります。
np.random.randint(1, 10, size=5)
# array([4, 5, 6, 4, 6])
確率分布にもとづく乱数を生成
Numpyのrandomモジュールでは、登場頻度の高い確率分布に関しては関数が用意されており、その確率分布にもとづく乱数を簡単に生成することができます。
正規分布にもとづく乱数生成
正規分布(1次元の分布)に基づく乱数生成は、no.random.normal(mu, sigma)で生成することができます。
mu, sigmaは下記の正規分布のパラメータ$\mu, \sigma$に相当します。
\mathcal{N}(x | \mu, \sigma) = - \frac{1}{\sqrt{2 \pi \sigma^2}} exp \biggl \{ - \frac{(x- \mu)^2}{2\sigma^2} \biggr \}
正規分布から乱数を得るには、下記のコードを実行します。ここでは、$\mu = 0, \sigma = 10$を指定しています。
np.random.normal(0, 10)
# => -3.9303944380779283
ベータ分布にもとづく乱数生成
ベータ分布に基づく乱数は、np.random.beta(a, b)で生成することができます。
$a, b$ はそれぞれ下記のベータ分布の$a, b$パラメータと同じです。
Beta(\mu | a, b) = C \mu^{a -1} (1 - \mu) ^ {b-1}
np.random.beta(1, 5, size=5)
# => array([0.01381918, 0.03882514, 0.13022268, 0.09677896, 0.08784262])
ガンマ分布にもとづく乱数生成
ガンマ分布にもとづく乱数は、random.gamma(shape, schale=value) で生成できます。
第一引数は、ガンマ分布のshapeパラメータ(下記の確率分布における$\alpha$)で、オプションで指定できるscaleオプションにscaleパラメータの値を指定します。(下記の確率分布における$\frac{1}{\beta}$)
Gam(\lambda | \alpha, \beta) = \frac{\beta^\alpha}{\Gamma(\alpha)} \lambda^{\alpha-1}e^{-\beta \lambda}
np.random.gamma(1, scale=0.5, size=5)
# => array([0.41558074, 0.22711258, 0.0241945 , 0.49991358, 0.09994257])
ポアソン分布にもとづく乱数生成
ポアソン分布に基づく乱数は、random.poisson(lam=value)で生成することができます。
オプションlamに、下記のポアソン分布の確率密度関数のパラメータを指定することができます。
Poi(x | \lambda ) = \frac {\lambda^{x}}{x !} e^{- \lambda}
np.random.poisson(lam=5, size=5)
# => array([4, 5, 6, 4, 6])
多変量ガウス分布にもとづく乱数生成
多変量のガウス分布に基づく乱数は、random.multivariate_normal(mean, cov, size)で得ることができます。
\mathcal{N}(\bm{x}|\bm{μ}, \bm{\Sigma}) = \frac{1}{\sqrt{(2\pi)^{D} |\Sigma|}} exp \biggl\{ -\frac{1}{2}(\bm{x}-\bm{μ})^T\Sigma^{-1}(\bm{x}-\bm{μ}) \biggr\}
上式における、$\bm{\mu}$と$\bm{\Sigma}$を、meanとcovで与えます。
mean = np.array([1, 2])
cov = np.array([[3, 4], [4, 8]])
np.random.multivariate_normal(mean, cov)