numpy.random.RandomState.multivariate_normal#

method

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

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

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

备注

新代码应该使用 multivariate_normal 方法,该方法属于 Generator 实例;请参考 快速入门 .

参数:
均值长度为 N 的类数组 1-D 数组

N 维分布的均值.

cov形状为 (N, N) 的类数组 2-D 数组

分布的协方差矩阵.对于适当的采样,它必须是对称的和正半定的.

sizeint 或 int 元组,可选

给定例如 (m,n,k) 的形状,则生成 mnk 个样本,并以 m -by- n -by- k 排列方式打包.由于每个样本都是 N 维的,因此输出形状为 (m,n,k,N) . 如果未指定形状,则返回单个( N -D)样本.

check_valid{ ‘warn’, ‘raise’, ‘ignore’ }, optional

协方差矩阵非正定时的行为.

tolfloat, optional

检查协方差矩阵中奇异值的容差.cov 在检查之前会被转换为 double 类型.

返回:
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., “Probability, Random Variables, and Stochastic Processes,” 3rd ed., New York: McGraw-Hill, 1991.

[2]

Duda, R. O., Hart, P. E., and Stork, D. G., “Pattern Classification,” 2nd ed., New York: 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(63.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