numpy.random.randn – 平均0標準偏差1の正規分布の乱数配列を生成

numpy.random.randnは、平均0、標準偏差1の正規分布の乱数を生成する関数です。

この関数は、科学技術計算言語のMatlabからコードをポーティングする人が簡便に使えるように用意されているもので、random.standard_normal関数と機能はまったく同じです。

両者の違いは、random.randnはshapeを指定する際、引数に数値を渡しますが、random.standard_normalは、numpy.zerosnumpy.onesのような他の多くのNumPy関数と同じようにタプルを渡す点にあります。

ここでは、このnumpy.random.randnについて解説します。

重要
NumPyのversion1.17以降は、平均0、標準偏差1の正規分布の乱数を生成する際には、standard_normal関数もrandn関数も使わずに、Generator.standard_normalというジェネレータメソッドを使うようになりました。こちらの方が圧倒的に処理速度が早く、NumPyを使った科学技術計算に適しています。『Generator.standard_normal – 平均0標準偏差1の正規分布から乱数配列を生成』で詳しく解説しているのでご確認ください。

目次

1. 書式

numpy.random.randn

書き方:

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の正規分布(ガウス分布とも言う)の乱数を生成する関数です。正規分布とは、以下のように平均値付近にデータが集積するような確率分布のことです。

In [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つ返ってきます。

In [1]:
import numpy as np
np.random.randn()
Out[1]:
-3.081251621140583

引数では、shapeを数値で指定することができます。shape属性については『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。

In [2]:
np.random.randn(3)
Out[2]:
array([-1.60690661,  0.64262114, -0.65647922])
In [3]:
np.random.randn(2, 3)
Out[3]:
array([[-1.24939161, -0.35309109, -0.27598552],
       [-0.67207772,  0.71140852, -0.5932904 ]])

任意の平均・標準偏差を指定する方法

さて、この関数を使って、平均や標準偏差を変えたい場合はどうすればいいでしょうか。平均がμ、分散がσ2 の正規分布 N(μ, σ2) からランダムな数値を得たいとしたら、次のように書きます。

σ * np.random.randn(...) + μ

σは標準偏差です。√σ2で求められます。

例として、N(3, 6.25)の正規分布からランダムな値を得たいとします。この場合、標準偏差は、√6.25=2.5です。そのため次のように書きます。

In [4]:
# N(3, 6.25)
2.5 * np.random.randn(2, 4) + 3
Out[4]:
array([[ 0.49531267,  7.58333369, -0.04781854,  4.23098194],
       [ 3.10918296,  0.98738211,  3.01666603,  3.48326637]])

ただし、任意の平均や標準偏差の正規分布の乱数を得たい場合は、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に一本化しましょう。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる