Generator.multivariate_normal – 多変量正規分布から乱数配列を作成する方法

Generator.multivariate_normalは、多変量正規分布から乱数配列を生成するジェネレータメソッドです。

多変量正規分布(または「多次元正規分布」もしくは「結合正規分布」)は、一次元の正規分布(ガウス分布)を高次元に汎化したものです。この分布は、平均値と共分散行列で特定することができます。多変量正規分布の場合、平均値は平均(average)ではなく中央値(center)を意味し、分散は標準偏差**2(standard deviation**2)ではなく幅**2(width**2)を意味します。

なお正規分布は以下で解説しています。

このGenerator.multivariate_normalについて解説していきます。

目次

1. 書式

Generator.multivariate_normal

書き方:

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軸に沿って分布していることを意味します。

In [1]:
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 – 乱数生成のためのジェネレータオブジェクトの作成』に目を通しておいてください。

In [1]:
import numpy as np
rng = np.random.default_rng()
rng
Out[1]:
Generator(PCG64) at 0x7FB300387E58

こうして作成したジェネレータオブジェクト rng に対して、Generator.multivariate_normalを呼び出すことによって、多変量正規分布から乱数配列を取得することができます。

In [2]:
mean = (1, 2)
cov = [[1, 0], [0, 1]]
rng.multivariate_normal(mean, cov, (3, 3))
Out[2]:
array([[[ 0.20467753,  1.46929179],
        [ 1.17177173,  1.27580982],
        [ 4.00138279,  1.25510977]],

       [[ 0.90355236,  2.21832508],
        [-1.63140919,  2.01916067],
        [ 1.80089768,  2.43755707]],

       [[ 0.5108232 ,  0.36725757],
        [ 1.26623889,  2.00696756],
        [ 4.14715722,  1.43490286]]])

0.6 は、標準偏差のおおよそ倍なので、以下はおそらく正でしょう。

In [3]:
x = rng.multivariate_normal(mean, cov, (3, 3))
list((x[0,0,:] - mean) < 0.6)
Out[3]:
[True, True]

3. まとめ

以上のように、Generator.multivariate_normalは、多変量正規分布から乱数配列を生成するジェネレータメソッドです。

以前は、numpy.random.multivariate_normal関数が使われていましたが、ジェネレータメソッドを使うようにしましょう。こちらの方が、処理が高速で、大量のデータを扱う科学技術計算に適しているからです。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる