NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。简单的来水numpy在处理多维数组时会特别的方便,是深度学习的得力助手。

numpy.random.multivariate_normal()函数官方解释是从多元正态分布中随机抽取样本的函数。多元正态分布、多重正态分布或高斯分布它是一维正态分布向更高维度的推广。这种分布由其均值和协方差矩阵来表示。这些参数类似于一维正态分布的平均值(平均值或“中心”)和方差(标准差或“宽度”,平方)。啥啥啥?对于数学不好的我完全看不懂说的是什么。其实就是这个函数可以满足你的需求,生成一个指定维度的数组,而且生成的这个数组服从正态分布。

函数的原型为:numpy.random.multivariate_normal(mean, cov[, size, check_valid, tol]).接下来对参数进行解释。

mean:均值,n维分布的平均值,是一个一维数组长度为N.在标准正态分布里对应的就是图形的峰值。

cov:分布的协方差矩阵,它的形状必须是(n,n),也就是必须是一个行数和列数相等的类似正方形矩阵,它必须是对称的和正半定的,才能进行适当的采样。

size:指定生成样本的大小,是一个int类型或者int类型的元组。可选。例如,给定(m,n,k)的形状,则会生成m*n*k样本,并按m-x-n-x-k排列打包。因为每个样本都是N维的,所以输出形状是(m,n,k,N)。如果未指定形状,则返回单个(N-d)样本。

在这里需要说明的是mean和cov必须有相同的长度,否则编译的时候会报错。比如mean=[0,0],cov=[[1,0,0],[0,1,0],[0,0,1]],这样是不可以的因为mean的长度为2,而cov的形状是(3,3),这样在编译的时候会产生一个ValueError: mean and cov must have same length错误。再结合size中的例子,如果size指定(3,3)的元组,mean=[1,2],cov=[[1,0],[0,100]],那么输出的形状就是(3,3,2).

check_valid:可以为{'warn'、'raise'、'ignore'},可选,来指定协方差矩阵非正半定时的行为。

tol:浮点型,可选。检查协方差矩阵中的奇异值时的公差。

返回值:一个n维数组。如果指出了形状尺寸也就是前边的size,则生成的样本为指定的形状,如果没有提供size,则生成的样本形状为(n,)

补充知识点Note:

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

cov:也就是Covariance,协方差表示两个变量在一起变化的程度。从多元正态分布中,我们得到了n维样本,x=[x_1,x_2,……xnn]。协方差矩阵元素c_i j_是x_i和x_j的协方差。元素c_ii_是x_i的方差(即其“排列”)。

在指定cov的时候,我们经常需要对角矩阵,这时我们可以使用numpy.eye()来直接生成一个对角矩阵,比如numpy.eye(2)就会生成对角矩阵[[1,0],[0,1]]

有两种情况可以不指定协方差矩阵:

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

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

注意协方差矩阵必须是半正定的(也就是非负定的)。否则,该方法的行为是未定义的,不能保证向后兼容性。

1 import numpy as np
2 mean = (1, 2)
3 cov = [[1, 0], [0, 1]]
4 x = np.random.multivariate_normal(mean, cov, (3, 3))
5 print(x.shape)

可以看到输出结果为(3,3,2)。