numpy.random.normal関数で正規分布から乱数配列を作成する方法

numpy.random.normal関数は、任意の平均・標準偏差の正規分布(「ガウス分布」とも言う)から乱数を生成する関数です。このページでは、この関数について解説します。

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

目次

1. 書式

numpy.random.normal

書き方:

np.random.normal(loc=0.0, scale=1.0, size=None)

パラメーター:

loc: float or array_like of floats
正規分布の平均値。デフォルト値は0.0。
scale: float or array_like of floats
正規分布の標準偏差。デフォルト値は1.0。
size: int or tuple of ints, optional
配列のshapeを指定する。Noneの場合で、locとscaleがどちらもスカラーなら、1つの数値を返す。それ以外の場合は、np.broadcast(loc, scale).size の個数の数値を返す。

戻り値: 

ndarray or scalar:
パラメータで指定した正規分布から数値を返す

一緒に確認したい関数:

  • Generator.normal: 任意の平均・標準偏差の正規分布から乱数を生成するメソッド。新しいコードを書くときは、これを優先して使うこと。
  • scipy.stats.norm:

numpy.random.normalは、任意の正規分布(ガウス分布)の中から、乱数を生成します。正規分布とは何かについて簡潔に解説しておきます。

正規分布とは

ガウス分布の確率密度は、次の式で表されます。

μ は平均値、σ は標準偏差、σ2 は分散です。この関数のピークは平均値にあり、広がりは x+σ と x-σ まであります。正規分布では平均値にある数値の方が得られやすく、そこから離れた値ほど得られにくくなるということです。

これを図にしたものが以下です。

まずは平均値0、標準偏差10の正規分布です。

In [1]:
import numpy as np
import matplotlib.pyplot as plt
rand3 = np.random.normal(0, 10, 1000000)
plt.hist(rand3, bins=1000)
plt.xlabel('x')
plt.ylabel('frequency')
plt.xlim(-60, 60)
plt.show()

これが平均20・標準偏差10だと次のようになります。

In [2]:
import numpy as np
import matplotlib.pyplot as plt
rand3 = np.random.normal(20, 10, 1000000)
plt.hist(rand3, bins=1000)
plt.xlabel('x')
plt.ylabel('frequency')
plt.xlim(-40, 40)
plt.show()

numpy.random.normalは、こうした正規分布(ガウス分布)の中から、乱数を生成します。

2. サンプルコード

それでは、この関数を使って乱数を生成してみましょう。

平均値と標準偏差だけを指定すると、その正規分布の中から値を1つ返します。

In [1]:
# 平均を0に、標準偏差を0.1の正規分布から数値を取得
import numpy as np
np.random.normal(0, 0.1)
Out[1]:
0.0002619446306721982

第三引数でshapeを指定すると、正規分布からランダムに取り出した値を要素とした配列を生成します。

In [2]:
# 1次元配列で値を取得
np.random.normal(0, 0.1, 3)
Out[2]:
array([0.13415695, 0.05907306, 0.03957742])

2次元配列以上を出力する時は、shapeをタプルで渡します。shape属性については『NumPyのshape属性 – 配列の形状の確認と変更』で解説しています。

In [3]:
# 2次元配列で値を取得
np.random.normal(0, 0.1, (2, 3))
Out[3]:
array([[-0.04348408, -0.03998982,  0.13836223],
       [-0.07294112,  0.07036188, -0.00540975]])

それでは、平均がμ、分散がσ2 の正規分布 N(μ, σ2) から乱数を生成するには、どう書けば良いでしょうか。

例えば、N(3, 6.25)としましょう。この場合、分散(σ2)が6.25なので、標準偏差のsigma(σ)は、√6.25=2.5です。そのため、次のように書きます。

In [4]:
# N(3, 6.25)
np.random.normal(3, 2.5, (3, 2))
Out[4]:
array([[3.70240629, 2.99122748],
       [1.31339454, 0.39931026],
       [1.39874727, 5.55294345]])

3. まとめ

以上、numpy.random.normalは、任意の平均と標準偏差の正規分布から乱数を生成する関数です。現在は、この関数は使わずに、Generatot.normalメソッドを使います。こちらの方が遥かに高速です。今後、新しい乱数を生成する際は、Generator.normalメソッドを使うようにしましょう。

なお、正規分布から乱数を生成する関数には、以下のものもあります。

これらはどちらも、平均0・標準偏差0.1の標準正規分布から乱数を生成する関数です。現在では、これらの関数も使わずに、Generator.standard_normalメソッドを使います。

併せて確認しておくと良いでしょう。

Python初心者におすすめのプログラミングスクール

「未経験からでもPythonを学べるプログラミングスクールを探しているけど、色々ありすぎてわからない」なら、次の3つのプログラミングスクールから選んでおけば間違いはありません。

Aidemy Premium:全くの初心者ができるだけ効率よく短期間で実務的に活躍できるAI人材になることを目的とした講座。キャリアカウンセリングや転職エージェントの紹介などの転職支援も充実しており、受講者の転職成功率が高い。

AIジョブカレPythonの基本をおさえた人が、実際に機械学習やディープラーニングを活用できるようになるための講座。転職補償型があるなどキャリア支援の内容が非常に手厚く、講師の質も最高クラス。コスパ最高。Python初心者用の対策講座もある。

データミックスプログラミング経験者のビジネスマンが、更なるキャリアアップのためにデータの処理方法を学んでデータサイエンティストになるための講座。転職だけでなく起業やフリーランスとして独立する人も多い。Python初心者用の対策講座もある。

特に、あなたが以下のような目標を持っているなら、この中から選んでおけば間違いはないでしょう。

・未経験からPythonエンジニアとして就職・転職したい
・AIエンジニアやデータサイエンティストとしてキャリアアップしたい
・起業やフリーランスを視野に入れたい

理由は「Python初心者のためのおすすめプログラミングスクール3選」で解説しています。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる