1. ホーム
  2. python

[解決済み] numpy.random.multivariate_normal(mean, cov[, size]) を用いて複数サンプルを描画する。

2022-01-29 16:04:43

質問

numpy関数の使用 numpy.random.multivariate_normal() 平均と共分散を与えれば、多変量ガウスからランダムにサンプルを抽出することができます。

一例として

import numpy as np
mean = np.zeros(1000)  # a zero array shaped (1000,)
covariance = np.random.rand(1000, 1000) 
# a matrix of random values shaped (1000,1000)
draw = np.random.multivariate_normal(mean, covariance)
# this outputs one "draw" of a multivariate norm, shaped (1000,)

上記の関数は、多変量ガウシアンから1つの "draw"を出力します。 (1000,) (共分散行列が整形されているので 1000,1000) ).

200枚のドローが欲しいです。どうすればいいのでしょうか?私はリスト内包を作成しますが、反復を作成する方法がわかりません。

EDIT:この違いは何ですか?

draw_A = np.random.rand(1000, 1000, 200)

そして

draw_B = [np.random.multivariate_normal(mean, covariance) for i in range(200)]

?

はい。 draw_B はリストですが、どちらも200の独立したドローの形をしていますか? 1000,1000) ?

解決方法は?

をお気づきですか? size の引数は docstring ?

例えば、この呼び出しは3次元分布から5つのサンプルを生成します。

In [22]: np.random.multivariate_normal(np.zeros(3), np.eye(3), size=5)
Out[22]: 
array([[ 1.08534253,  0.70492174, -0.8625333 ],
       [ 0.16955737, -0.89453284,  0.8347796 ],
       [ 0.49506717, -1.18087912, -0.89118919],
       [-0.97837406, -0.42304268,  0.4326744 ],
       [-1.18836816,  1.33389231,  0.23616035]])


編集された質問に対する回答。

  • np.random.rand(d0, d1, d2) 作る d0*d1*d2 からランダムに抽選されます。 一変量 一様 0, 1)に分布し,それを配列で返し,形状は (d0, d1, d2) .
  • np.random.multivariate_normal(mean, cov, size=n) ここで mean は形状を持つ配列 (m,)cov は形状を持つ配列 (m, m) を作成します。 n は多変量正規分布からドローを生成し,それを形状が (n, m) . リスト内包 draw_B も多変量正規分布から、関数呼び出しごとに1サンプルずつサンプルを取得し、サンプルを配列ではなくリストに格納します。