numpy.random.Generator.multivariate_normal#

方法

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

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

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

参数:
mean1-D 类数组,长度为 N

N 维分布的均值.

cov2-D array_like, 形状为 (N, N)

分布的协方差矩阵.它必须是对称的且半正定的,以进行适当的采样.

size整数或整数的元组,可选

给定一个形状,例如 (m,n,k) ,会生成 m*n*k 个样本,并以 m-by-n-by-k 的排列方式打包.因为每个样本是 N 维的,输出形状是 (m,n,k,N) .如果没有指定形状,则返回一个单一的(N 维)样本.

check_valid{ ‘warn’, ‘raise’, ‘ignore’ }, 可选

当协方差矩阵不是半正定时的情况.

tol浮点型, 可选

在检查协方差矩阵中的奇异值时的容差.cov 在检查前会被转换为双精度.

method{ ‘svd’, ‘eigh’, ‘cholesky’}, 可选

cov 输入用于计算一个因子矩阵 A,使得 A @ A.T = cov.此参数用于选择计算因子矩阵 A 的方法.默认方法 ‘svd’ 是最慢的,而 ‘cholesky’ 是最快的,但比最慢的方法鲁棒性差.方法 eigh 使用特征分解来计算 A,比 svd 快但比 cholesky 慢.

在 1.18.0 版本加入.

返回:
outndarray

绘制的样本,形状为 size,如果提供了该参数.如果没有提供,形状为 (N,).

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

备注

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

协方差表示两个变量共同变化的程度.从多元正态分布中,我们抽取 N 维样本,:math: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
>>> rng = np.random.default_rng()
>>> x, y = rng.multivariate_normal(mean, cov, 5000).T
>>> plt.plot(x, y, 'x')
>>> plt.axis('equal')
>>> plt.show()

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

此函数内部使用线性代数例程,因此结果在不同架构、操作系统甚至不同构建中可能不完全相同(即使在精度范围内).例如,如果 cov 有多个相等的奇异值且 method'svd'``(默认),这种情况很可能发生.在这种情况下,``method='cholesky' 可能更稳健.

参考文献

[1]

Papoulis, A., “概率、随机变量和随机过程,” 第三版, 纽约: McGraw-Hill, 1991.

[2]

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

示例

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

我们可以使用不同于默认的方法来分解 cov:

>>> y = rng.multivariate_normal(mean, cov, (3, 3), method='cholesky')
>>> y.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 = rng.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-Generator-multivariate_normal-1.png