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