np.random.multivariate_normal
是 NumPy 中生成多元正态分布随机样本的函数。它允许我们指定多个维度(变量)的均值和协方差矩阵,从而生成符合这些参数的随机样本。这个函数常用于模拟多维数据,特别是需要考虑变量间相关性的场景,比如机器学习中的数据生成。
函数语法
np.random.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8)
参数说明
-
mean
:一个 1 维数组,表示每个维度的均值。- 这是一个向量,长度为要生成的多元正态分布的维度数。每个元素代表对应维度的均值。
-
cov
:协方差矩阵(2 维数组),表示变量之间的相关性。- 这是一个对称的矩阵,形状为 ( (n \times n) ),其中 ( n ) 是维度数。矩阵中的对角线元素是各个维度的方差,非对角线元素是维度之间的协方差。
-
size
:生成样本的数量(默认为None
)。- 如果指定为
None
,返回单个样本;如果指定为整数,则生成size
个样本。
- 如果指定为
-
check_valid
:用于检查协方差矩阵的参数,默认值为'warn'
。'warn'
:当协方差矩阵无效时,会发出警告。'raise'
:当协方差矩阵无效时,会抛出错误。'ignore'
:忽略无效性检查。
-
tol
:用于判断协方差矩阵有效性的阈值。
返回值
返回一个遵循给定均值和协方差的随机样本。如果 size
参数为 None
,返回形状为 (n,)
的 1 维数组;如果指定 size
为整数 m
,返回形状为 (m, n)
的二维数组。
示例 1:生成二维正态分布的样本
假设我们希望生成两个维度的正态分布样本,均值分别为 ( [0, 2] ),协方差矩阵为:
cov
=
[
1
0.8
0.8
1
]
\text{cov} = \begin{bmatrix} 1 & 0.8 \\ 0.8 & 1 \end{bmatrix}
cov=[10.80.81]
这表示两个变量之间的相关性很强,协方差为 0.8。
import numpy as np
import matplotlib.pyplot as plt
# 均值向量和协方差矩阵
mean = [0, 2]
cov = [[1, 0.8], [0.8, 1]]
# 生成 500 个样本
data = np.random.multivariate_normal(mean, cov, size=500)
# 绘制生成的样本点
plt.scatter(data[:, 0], data[:, 1], alpha=0.5)
plt.title('Samples from Multivariate Normal Distribution')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
示例 2:生成三维正态分布的样本
如果我们需要生成三维的正态分布,可以使用类似的方法,设定三维的均值和 3x3 的协方差矩阵。
mean = [1, 2, 3]
cov = [[1, 0.5, 0.2], [0.5, 1, 0.3], [0.2, 0.3, 1]]
# 生成 1000 个样本
data = np.random.multivariate_normal(mean, cov, size=1000)
# 查看生成的前几个样本
print(data[:5])
示例 3:检查协方差矩阵的有效性
协方差矩阵必须是正定的,这意味着它的特征值必须大于 0。如果协方差矩阵无效(比如不是对称的或者不是正定的),函数可能会发出警告或错误信息。
mean = [0, 2]
invalid_cov = [[1, 2], [3, 1]] # 非对称协方差矩阵
# 使用无效协方差矩阵,会得到警告或错误
data = np.random.multivariate_normal(mean, invalid_cov, size=100)
你可以通过 check_valid
参数控制这种情况如何处理:
data = np.random.multivariate_normal(mean, invalid_cov, size=100, check_valid='raise')
生成数据的几何解释
在二维情况下,np.random.multivariate_normal
生成的数据分布在一个椭圆形的区域。均值决定了椭圆的中心位置,协方差矩阵决定了椭圆的形状和方向:
- 方差:协方差矩阵的对角线元素是每个维度的方差,控制了椭圆在该维度方向的扩展程度。方差越大,椭圆在该维度方向上越“宽”。
- 协方差:非对角线元素是协方差,控制了不同维度之间的关联性。协方差越大,两个维度的相互关系越强,椭圆的形状越倾斜。
总结
np.random.multivariate_normal
是一个强大的工具,用于生成符合指定均值和协方差的多元正态分布样本。它在模拟多维数据集、生成具有相关性的样本时特别有用,在机器学习和统计建模中经常用来生成测试数据。