numpy.random.RandomState.multivariate_normal#

方法

random.RandomState.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8)#

从多元正态分布中随机抽取样本。

多元正态分布、多变量正态分布或高斯分布是一维正态分布到更高维度的推广。这种分布由其均值和协方差矩阵指定。这些参数类似于一维正态分布的均值(平均值或“中心”)和方差(标准差或“宽度”的平方)。

注意

新的代码应该使用 multivariate_normal 方法,该方法是 Generator 实例的方法;请参阅 快速入门

参数:
mean长度为 N 的一维类数组

N 维分布的均值。

cov形状为 (N, N) 的二维类数组

分布的协方差矩阵。为了进行正确的采样,它必须是对称的且半正定的。

size整数或整数元组,可选

例如,给定形状为 (m,n,k),则会生成 m*n*k 个样本,并将其打包成 m x n x k 的排列。因为每个样本都是 N 维的,所以输出形状为 (m,n,k,N)。如果未指定形状,则返回单个(N 维)样本。

check_valid{'warn','raise','ignore'},可选

当协方差矩阵不是半正定时,程序的行为。

tol浮点数,可选

检查协方差矩阵奇异值时的容差。在检查之前,cov 会被强制转换为双精度浮点数。

返回值:
outndarray

抽取的样本,形状为 size(如果提供了)。如果没有,则形状为 (N,)

换句话说,每个条目 out[i,j,...,:] 是从分布中抽取的一个 N 维值。

另请参阅

random.Generator.multivariate_normal

对于新代码,应该使用此方法。

注释

均值是 N 维空间中的一个坐标,表示最有可能生成样本的位置。这类似于一维或单变量正态分布的钟形曲线的峰值。

协方差表示两个变量一起变化的程度。从多元正态分布中,我们抽取 N 维样本,\(X = [x_1, x_2, ... x_N]\)。协方差矩阵元素 \(C_{ij}\)\(x_i\)\(x_j\) 的协方差。元素 \(C_{ii}\)\(x_i\) 的方差(即它的“扩展”)。

除了指定完整的协方差矩阵外,常用的近似方法还包括

  • 球形协方差(cov 是单位矩阵的倍数)

  • 对角协方差(cov 具有非负元素,并且仅在对角线上)

可以通过绘制生成的点来查看这种几何特性,例如在二维中

>>> mean = [0, 0]
>>> cov = [[1, 0], [0, 100]]  # diagonal covariance

对角协方差意味着点沿 x 轴或 y 轴方向。

>>> import matplotlib.pyplot as plt
>>> x, y = np.random.multivariate_normal(mean, cov, 5000).T
>>> plt.plot(x, y, 'x')
>>> plt.axis('equal')
>>> plt.show()

请注意,协方差矩阵必须是半正定的(又称非负定)。否则,此方法的行为未定义,并且不保证向后兼容性。

参考文献

[1]

Papoulis,A.,“概率、随机变量和随机过程”,第 3 版,纽约:麦格劳-希尔,1991 年。

[2]

Duda,R. O.,Hart,P. E. 和 Stork,D. G.,“模式分类”,第 2 版,纽约:Wiley,2001 年。

示例

>>> mean = (1, 2)
>>> cov = [[1, 0], [0, 1]]
>>> x = np.random.multivariate_normal(mean, cov, (3, 3))
>>> x.shape
(3, 3, 2)

这里我们从均值为 [0, 0]、协方差矩阵为 [[6, -3], [-3, 3.5]] 的二元正态分布中生成 800 个样本。样本的第一和第二分量的预期方差分别为 6 和 3.5,预期相关系数为 -3/sqrt(6*3.5) ≈ -0.65465。

>>> cov = np.array([[6, -3], [-3, 3.5]])
>>> pts = np.random.multivariate_normal([0, 0], cov, size=800)

检查样本的均值、协方差和相关系数是否接近预期值

>>> pts.mean(axis=0)
array([ 0.0326911 , -0.01280782])  # may vary
>>> np.cov(pts.T)
array([[ 5.96202397, -2.85602287],
       [-2.85602287,  3.47613949]])  # may vary
>>> np.corrcoef(pts.T)[0, 1]
-0.6273591314603949  # may vary

我们可以使用散点图来可视化此数据。点云的方向说明了此样本分量的负相关性。

>>> import matplotlib.pyplot as plt
>>> plt.plot(pts[:, 0], pts[:, 1], '.', alpha=0.5)
>>> plt.axis('equal')
>>> plt.grid()
>>> plt.show()
../../../_images/numpy-random-RandomState-multivariate_normal-1.png