为什么 np.random.multivariate_normal 方法生成的样本与协方差矩阵不兼容?

Why samples generated by np.random.multivariate_normal method are not compatible with covariance matrix?

我正在研究数据驱动的稳健优化方法。在数值结果部分,我需要使用示例数据来验证该方法。我使用 np.random.multivariate_normal 生成数据,我为其提供协方差矩阵和均值向量,如下所示:

mean = [-1000, 1,1,1]
cov = [[200,0,0,0],[0,0.001,0,0],[0,0,0.001,0],[0,0,0,0.001]]

生成数据后,样本的第一个分量不分布在[-1200,-800]区间内,而是属于更小的区间(如[-1003,-997]) .我需要生成样本数据,其第一个组件在 [-1200,-800] 区间内分布更广泛。我使用的代码如下:

import numpy as np
import matplotlib.pyplot as plt
from numpy.random import multivariate_normal
# First 2D gaussian:
n=50 #number of samples
mean = [-1000, 1,1,1]
cov = [[200,0,0,0],[0,0.001,0,0],[0,0,0.001,0],[0,0,0,0.001]]
Samples = np.random.multivariate_normal(mean, cov, n).T

我不知道哪里错了。

您似乎要求均值为 -1000 且方差为 1(或者更确切地说,原始问题是这样做的;它似乎已更新为 200,但这与-1003:-997 后述)。

请注意,我们期望无限总体中 99.9% 的值在 3 西格玛(标准差,$\sqrt{Var}$)以内,这对您来说基本上是 3。所以您的结果是预期的(请参阅图片)。

如果您想要更大的方差,您需要在 cov 中指定。

猜测并检查以获得正确的方差

这里是我做的一些乱七八糟的事情,以表明方差逐渐增加:

>>> import numpy as np
# increase n to get more asymptotic
>>> n = 1000
# what you had
>>> mean = [-1000, 1,1,1]
>>> cov = [[1,0,0,0],[0,0.001,0,0],[0,0,0.001,0],[0,0,0,0.001]]
>>> Samples = np.random.multivariate_normal(mean, cov, n).T
>>> min(Samples[0,:])
-1003.1521026984535
# larger variance ([0, 0] element)
>>> cov = [[200,0,0,0],[0,0.001,0,0],[0,0,0.001,0],[0,0,0,0.001]]
>>> Samples = np.random.multivariate_normal(mean, cov, n).T
>>> min(Samples[0,:])
-1058.8437937762053
# yet larger variance
>>> cov = [[2000,0,0,0],[0,0.001,0,0],[0,0,0.001,0],[0,0,0,0.001]]
>>> Samples = np.random.multivariate_normal(mean, cov, n).T
>>> min(Samples[0,:])
-1145.3564799931166
# yet larger variance
>>> cov = [[4000,0,0,0],[0,0.001,0,0],[0,0,0.001,0],[0,0,0,0.001]]
>>> Samples = np.random.multivariate_normal(mean, cov, n).T
>>> min(Samples[0,:])
-1247.6489017302786 

找到所需方差的另一种方法

你还可以通过分析来解决这个问题。假设您希望 -1200 到 -800 作为您的范围,您的平均值是 -1000。因此,您希望 3 sigma 为 200,因此您希望 sigma 为 ~66.7。

方差是 sigma 平方,所以 $66.7^2 = 4448.89$。事实证明这与我通过猜测和检查得出的答案非常接近,方差为 4000。

因此,根据所需的数据范围,您可以有规律地选择方差。