Generator.multivariate_normalは、多変量正規分布から乱数配列を生成するジェネレータメソッドです。
多変量正規分布(または「多次元正規分布」もしくは「結合正規分布」)は、一次元の正規分布(ガウス分布)を高次元に汎化したものです。この分布は、平均値と共分散行列で特定することができます。多変量正規分布の場合、平均値は平均(average)ではなく中央値(center)を意味し、分散は標準偏差**2(standard deviation**2)ではなく幅**2(width**2)を意味します。
なお正規分布は以下で解説しています。
このGenerator.multivariate_normalについて解説していきます。
1. 書式
書き方:
Generator.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8)
パラメーター:
mean: 1-D array_like, of length N N次元分布の中央値 |
cov: 2-D array_like, of shape(N, N) 分布の共分散行列。標本と対称の正の半定値でなければならない。 |
size: int or tuple of ints, optional 出力する配列のshapeを指定する。デフォルト値のNoneの場合は、1つの(N-D)の乱数を返す。(m, n, k)と指定するとshape(m, n, k, N)の乱数配列を返す。 |
check_valid: {‘warn’, ‘raise’, ‘ignore’}, optional 共分散行列が正の判定値でない場合の挙動 |
tol: float, optional 共分散行列の中の特異値をチェックしている時のトレランス。チェックの前に、covはdoubleにキャストされる。 |
method: {‘svd’, ‘eigh’, ‘cholesky’}, optional covの入力は、A @ A.T = covというように因子行列Aを計算するために使われる。この変数では、因子行列Aを計算するメソッドを選択することができる。デフォルト値の’svd’は最も遅く、’cholesky’は最も早い。’eigh’は、Aの計算に固有値分解を使う。 |
戻り値:
out: ndarray 指定のshapeの多変量正規分布からの乱数を出力する。sizeを指定しない場合はshape(N,)の乱数配列を出力する。 |
Notes
meanは、N次元スペースにおける座標です。これは、乱数が最頻する場所を表します。1次元ベルカーブや単一変量の正規分布のピークと類似したものです。
covarianceは、2つの変数の変化レベルを示します。多変量正規分布からは、N次元の標本 X=[x1, x2, …xN] を取得します。共分散行列の要素Cijは、xiとxjの共分散です。要素Cijは、xiの分散です。
共分散行列を完全に特定する代わりに、
- 球面共分散: covは単位行列の積
- 対角共分散: covは対角線上の負の値ではない要素
の近似を含みます。
この幾何学的特性は、生成したデータポイントをプロットすることで2次元で見ることができます。対角共分散は、データポイントはx軸かy軸に沿って分布していることを意味します。
mean = [0, 0]
cov = [[1, 0], [0, 100]] # 対角共分散
import matplotlib.pyplot as plt
x, y = np.random.default_rng().multivariate_normal(mean, cov, 5000).T
plt.plot(x, y, 'x')
plt.axis('equal')
plt.show()
共分散行列は、必ず正の半定値でなければいけません。そうでない場合は、メソッドが定義されず、後方互換性が保証されません。
2. サンプルコード
それでは、サンプルコードを見ていきましょう。
まずは、random.default_rng コンストラクタでジェネレータオブジェクトを作成します。『numpy.random.default_rng – 乱数生成のためのジェネレータオブジェクトの作成』に目を通しておいてください。
import numpy as np
rng = np.random.default_rng()
rng
こうして作成したジェネレータオブジェクト rng に対して、Generator.multivariate_normalを呼び出すことによって、多変量正規分布から乱数配列を取得することができます。
mean = (1, 2)
cov = [[1, 0], [0, 1]]
rng.multivariate_normal(mean, cov, (3, 3))
0.6 は、標準偏差のおおよそ倍なので、以下はおそらく正でしょう。
x = rng.multivariate_normal(mean, cov, (3, 3))
list((x[0,0,:] - mean) < 0.6)
3. まとめ
以上のように、Generator.multivariate_normalは、多変量正規分布から乱数配列を生成するジェネレータメソッドです。
以前は、numpy.random.multivariate_normal関数が使われていましたが、ジェネレータメソッドを使うようにしましょう。こちらの方が、処理が高速で、大量のデータを扱う科学技術計算に適しているからです。
コメント