numpy.random.standard_normalは、平均0標準偏差1の正規分布の乱数を生成する関数です。
これとまったく同じ機能のものに、numpy.random.randn関数があります。違いは、引数でshapeを指定する際に、standard_normalはタプルを渡しますが、randnは数値を渡す点にあります。
ここでは、standard_normalについて解説します。
重要
NumPyのversion1.17以降は、平均0、標準偏差1の正規分布の乱数を生成する際には、standard_normal関数もrandn関数も使わずに、Generator.standard_normalというジェネレータメソッドを使うようになりました。こちらの方が圧倒的に処理速度が早く、NumPyを使った科学技術計算に適しています。『Generator.standard_normal – 平均0標準偏差1の正規分布から乱数配列を生成』で詳しく解説しているのでご確認ください。
1. 書式
書き方:
numpy.random.standard_normal(size=None)
パラメーター:
size: int or tuple of ints, optional 戻り値の配列の次元数を指定する。この引数を指定しない場合は、浮動小数点(float型)の数値を1つ返す。 |
戻り値:
float or ndarray: 要素の型が浮動小数点の任意のshapeの配列、またはsizeを指定しない場合はランダムな浮動小数点の値。 |
一緒に確認したい関数:
- Generator.standard_normal: 平均0標準偏差1の正規分布の乱数配列を生成するメソッド。新しいコードを書くときは、これを優先して使うこと
- random.normal: 任意の平均・標準偏差の正規分布の乱数配列を生成する関数
- random.randn: 平均0標準偏差1の正規分布の乱数配列を生成する関数
標準正規分布とは
繰り返しになりますが、numpy.random.standard_normalは、numpy.random.randnと同じく、平均0標準偏差1の正規分布(「ガウス分布」とも言う)の乱数を生成する関数です。
正規分布とは、以下のように平均値付近にデータが集積するような確率分布のことです。
import numpy as np
import matplotlib.pyplot as plt
rand = np.random.standard_normal(1000000)
plt.hist(rand, bins=300)
plt.xlabel('x')
plt.ylabel('frequency')
plt.xlim(-5, 5)
plt.show()
numpy.random.standard_normalの値は、この標準正規分布の中からランダムに生成されます。つまり、平均の0に近い数値ほど頻繁に生成されるということです。
それでは、コードを見てみましょう。
2. サンプルコード
引数に何も指定しない場合は、正規分布の中からランダムな浮動小数点の数値を1つ返します。
import numpy as np
np.random.standard_normal()
sizeの指定
引数にshapeを渡すと、ランダムな数値の配列を返します。
np.random.standard_normal(3)
2次元配列以上では、shapeをタプルで渡します。shape属性については『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。
np.random.standard_normal((2, 3))
任意の平均・標準偏差を指定する方法
もし平均がμ、分散がσ2 の正規分布 N(μ, σ2) からランダムな数値を得たいとしたら、次のように書きます。なお、σは標準偏差です(※標準偏差 = √分散2)。
μ + σ * np.random.standard_normal(size=...)
例として、N(3, 6.25)の正規分布からランダムな値を得たいとします。この場合、標準偏差は、√6.25=2.5です。そのため次のように書きます。
# N(3, 6.25)
3 + 2.5 * np.random.standard_normal(size=(2, 4))
ただし、平均や標準偏差を操作するには、この方法よりも、numpy.random.normal関数を使う方が遥かに簡単です。この関数は引数で、平均と標準偏差を指定することができます。以下のページで解説しています。
3. まとめ
ここまで見てきた通り、numpy.random.standard_normalは、平均0、標準偏差1の正規分布から乱数を生成する関数です。これと全く同じ関数に、numpy.random.randnがあります。
両者の違いは下表の通りです。
Table: 標準正規分布(平均0標準偏差1)の乱数を生成する関数
関数 | 引数 | 備考 |
---|---|---|
standard_normal | タプル | – |
randn | 数値 | Matlabからコードをポートするユーザー用に用意された |
※現在は Generator.standard_normalメソッドの使用が推奨 |
しかし、現在では、これらの関数は使わずに、Generator.standard_normalメソッドを使います。ジェネレータを通して乱数を生成するこちらの方が、遥かに高速なため、大量の数値を扱う科学技術計算に適しています。
今後は、平均0標準偏差1の正規分布から乱数を生成する方法は、Generator.standard_normalに一本化しましょう。
コメント