numpy.random.RandomState.multivariate_normal#
方法
- random.RandomState.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8)#
从多元正态分布中抽取随机样本。
多元正态分布、多正态分布或高斯分布是一维正态分布向更高维度的推广。这种分布由其均值和协方差矩阵确定。这些参数类似于一维正态分布的均值(平均值或“中心”)和方差(标准差的平方,即“宽度”的平方)。
注意
新代码应改用
multivariate_normal
方法的Generator
实例;请参阅快速入门。- 参数:
- mean一维 array_like,长度为 N
N 维分布的均值。
- cov二维 array_like,形状为 (N, N)
分布的协方差矩阵。它必须是对称的且是半正定的,以便进行正确的采样。
- sizeint 或 int 的元组,可选
给定形状为例如
(m,n,k)
,则会生成m*n*k
个样本,并以 m×n×k 的排列方式打包。由于每个样本是 N 维的,输出形状为(m,n,k,N)
。如果未指定形状,则返回单个(N 维)样本。- check_valid{ ‘warn’, ‘raise’, ‘ignore’ },可选
当协方差矩阵不是半正定时采取的行为。
- tolfloat,可选
检查协方差矩阵中奇异值时的容差。检查前 cov 会被转换为双精度浮点数。
- 返回值:
- outndarray
抽取的样本,如果提供了 size,则形状为 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\) 的方差(即其“散布”)。
除了指定完整的协方差矩阵,常见的近似包括
这种几何特性可以通过绘制二维生成数据点来观察
>>> 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(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()