numpy.random.Generator.multivariate_normal#
方法
- random.Generator.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8, *, method='svd')#
从多元正态分布中随机抽取样本。
多元正态分布、多变量正态分布或高斯分布是一维正态分布到更高维度的推广。这种分布由其均值和协方差矩阵指定。这些参数类似于一维正态分布的均值(平均值或“中心”)和方差(标准差的平方或“宽度”)。
- 参数:
- mean长度为 N 的一维类数组
N 维分布的均值。
- cov形状为 (N, N) 的二维类数组
分布的协方差矩阵。为了进行正确的采样,它必须是对称的且半正定的。
- sizeint 或 int 元组,可选
给定一个形状,例如
(m,n,k)
,则会生成m*n*k
个样本,并将其打包到一个 mxnxk 的排列中。因为每个样本都是 N 维的,所以输出形状为(m,n,k,N)
。如果没有指定形状,则返回单个(N 维)样本。- check_valid{'warn','raise','ignore'},可选
协方差矩阵不是半正定时的行为。
- tolfloat,可选
检查协方差矩阵中奇异值时的容差。cov 在检查前被转换为双精度浮点数。
- method{'svd','eigh','cholesky'},可选
cov 输入用于计算一个因子矩阵 A,使得
A @ A.T = cov
。此参数用于选择用于计算因子矩阵 A 的方法。默认方法 'svd' 最慢,而 'cholesky' 最快,但不如最慢的方法鲁棒。方法 eigh 使用特征分解来计算 A,比 svd 快,但比 cholesky 慢。版本 1.18.0 中的新功能。
- 返回值:
- outndarray
如果提供了 size,则为形状为 size 的抽取样本。否则,形状为
(N,)
。换句话说,每个条目
out[i,j,...,:]
都是从分布中抽取的一个 N 维值。
备注
均值是 N 维空间中的一个坐标,它表示最有可能生成样本的位置。这类似于一维或单变量正态分布的钟形曲线的峰值。
协方差表示两个变量一起变化的程度。从多元正态分布中,我们抽取 N 维样本,\(X = [x_1, x_2, ... x_N]\)。协方差矩阵元素 \(C_{ij}\) 是 \(x_i\) 和 \(x_j\) 的协方差。元素 \(C_{ii}\) 是 \(x_i\) 的方差(即它的“扩展”)。
除了指定完整的协方差矩阵之外,常用的近似方法包括
可以通过绘制生成的点来在二维中看到此几何属性
>>> 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.,“概率、随机变量和随机过程”,第 3 版,纽约:麦格劳-希尔,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()