Numpyのrandomで生成できる乱数のまとめ

Posted: , Category: Numpy , Python

実務でデータ解析や機械学習のコードを書くなり調査したりしていると、特定の乱数を生成したくなる場面に毎日のように遭遇すると思います。

その都度ネットでググって、コードに打ち込んだ次の瞬間には忘却しているような気がしているので、今回は備忘録も含めて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)

【広告】
統計学的にあなたの悩みを解決します。
仕事やプライベートでお悩みの方は、ベテラン占い師 蓮若菜にご相談ください。

機械学習と情報技術