使用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)
吗?
答案 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
还从多元正态分布中提取样本,每个函数调用一个样本,并将样本放入列表而不是数组。