使用numpy.random.multivariate_normal(mean,cov [,size])绘制多个样本

时间:2016-01-21 19:20:24

标签: python arrays numpy random

使用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,)

上述函数从多变量高斯输出一个“绘制”,形状为(1000,)(因为协方差矩阵的形状为1000,1000))。

我想要200次抽奖。怎么做到这一点?我会创建一个列表理解,但我不知道如何创建迭代。

编辑:

之间有区别吗?
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)吗?

1 个答案:

答案 0 :(得分:3)

您是否注意到docstring中的size参数?

例如,此调用从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)从[0,1}上的单变量 统一分布中随机抽取d0*d1*d2,并将其返回到具有形状的数组中(d0, d1, d2)
  • np.random.multivariate_normal(mean, cov, size=n),其中mean是一个形状为(m,)的数组,而cov是一个形状为(m, m)的数组,使得n来自多元正态分布,并将它们作为形状为(n, m)的数组的行返回。您的列表推导draw_B还从多元正态分布中提取样本,每个函数调用一个样本,并将样本放入列表而不是数组。