知っておきたいNumPyのRandomサンプリング:標準正規分布とrandom.RandomState.standard_normal()


標準正規分布とは?

標準正規分布は、平均が0、標準偏差が1の正規分布です。正規分布は、多くの自然現象や統計データに見られる分布であり、その形状は鐘型曲線で表されます。

標準正規分布の特徴は以下の通りです。

  • データの合計は0になります。
  • 負の値も正の値も出現します。
  • データのほとんどは平均値付近に集中し、そこから離れるほどデータの出現頻度が低くなります。

random.RandomState.standard_normal()の使い方

random.RandomState.standard_normal()は以下の引数を取ります。

  • size: 生成する乱数の個数または形状を指定します。省略した場合、1つの乱数を生成します。タプルで指定すると、その形状の多次元配列として乱数を生成します。

この関数は、標準正規分布に従う乱数を生成したndarrayオブジェクトを返します。

以下のコードは、10個の標準正規分布に従う乱数を生成し、その平均と標準偏差を出力します。

import numpy as np

# 乱数生成
rng = np.random.RandomState()
data = rng.standard_normal(10)

# 平均と標準偏差の計算
mean = np.mean(data)
stddev = np.std(data)

# 結果の出力
print("平均:", mean)
print("標準偏差:", stddev)

このコードを実行すると、以下のような出力が得られます。

平均: 0.023997867934864824
標準偏差: 0.9984623200438491

random.RandomState.standard_normal()は、NumPyにおけるRandomサンプリングにおいて、標準正規分布に従う乱数を生成するために便利な関数です。この関数は、様々な統計分析や機械学習のタスクで使用することができます。



特定の個数の標準正規分布乱数を生成する

import numpy as np

# 乱数生成
rng = np.random.RandomState()
data = rng.standard_normal(10)

# データの表示
print(data)
[ 0.74918214  0.40494524 -0.15843207  1.05025681  0.03962977
  0.77491807 -0.32450703  0.50041343 -0.67110164  0.49182138]

特定の形状の多次元配列として標準正規分布乱数を生成する

この例では、(3, 4)形状の多次元配列として、標準正規分布に従う乱数を生成します。

import numpy as np

# 乱数生成
rng = np.random.RandomState()
data = rng.standard_normal((3, 4))

# データの表示
print(data)
[[ 0.80048237  0.42230532 -0.74152753  0.27784161]
 [ 0.50493912 -0.25004671  0.39033841  0.90471987]
 [-0.49510598  0.13198477  0.74930823 -0.65493487]]

特定の平均と標準偏差を持つ正規分布乱数を生成する

この例では、locscale引数を使用して、平均が5、標準偏差が2の正規分布に従う乱数を生成します。

import numpy as np

# 乱数生成
rng = np.random.RandomState()
data = rng.normal(loc=5, scale=2, size=10)

# データの表示
print(data)
[4.89006011 5.7422514  3.21922332 7.07106781 4.92483311
 6.80678492 5.40310554 3.89918032 5.66231343 7.99010042]

この例では、seed引数を使用してシード値を設定し、毎回同じ乱数を生成します。

import numpy as np

# 乱数生成
rng = np.random.RandomState(1234)
data1 = rng.standard_normal(10)
data2 = rng.standard_normal(10)

# データの表示
print(data1)
print(data2)
[ 0.80175849  0.58004562 -1.00407433  0.49110305  0.74350003
  0.00303344 -0.20078811  0.79338047  0.17484981  0.66231023]
[ 0.80175849  0.58004562 -1.00407433  0.49110305  0.74350003
  0.00


np.random.Generator.standard_normal()の使用

NumPy 1.17以降では、random.Generatorクラスが導入されました。このクラスは、より新しいランダム数生成アルゴリズムを使用しており、random.RandomStateよりも高速で効率的です。

random.Generator.standard_normal()は、random.RandomState.standard_normal()と同じ引数を取り、同じ機能を提供します。そのため、新しいコードでは、random.Generator.standard_normal()を使用することをお勧めします。

import numpy as np

# 乱数生成
rng = np.random.default_rng()  # デフォルトのGeneratorを取得
data = rng.standard_normal(10)

# データの表示
print(data)

NumPy以外にも、乱数生成のためのライブラリはいくつかあります。例えば、SciPyやstatsmodelsは、より高度な機能を持つ乱数生成関数を提供しています。

これらのライブラリの関数は、NumPyのrandom.RandomState.standard_normal()とは異なる引数やオプションを持つ場合がありますので、使用する前にドキュメントを確認する必要があります。

特定の状況

状況によっては、random.RandomState.standard_normal()以外の方法がより適切な場合があります。

  • 高速な乱数生成が必要な場合: 一部のライブラリは、NumPyよりも高速な乱数生成アルゴリズムを提供しています。例えば、Intel DNNLやOpenCLを使用して高速化された乱数生成ライブラリがあります。
  • 特定の分布からの乱数を生成したい場合: NumPyは、正規分布以外にも様々な分布からの乱数を生成するための関数を提供しています。例えば、gamma分布からの乱数を生成するには、np.random.gamma()関数を使用します。

random.RandomState.standard_normal()は、標準正規分布に従う乱数を生成する便利な関数ですが、より新しい方法や、特定の状況に適した代替方法も存在します。

新しいコードを書く場合は、random.Generator.standard_normal()を使用することをお勧めします。また、状況に応じて、他のライブラリや方法を検討することも重要です。