【问题标题】:Why samples generated by np.random.multivariate_normal method are not compatible with covariance matrix?为什么 np.random.multivariate_normal 方法生成的样本与协方差矩阵不兼容?
【发布时间】:2022-01-10 04:52:17
【问题描述】:

我正在研究数据驱动的稳健优化方法。在数值结果部分,我需要使用样本数据验证方法。我使用 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

我不知道我哪里错了。

【问题讨论】:

  • 在问题的开头,你说你给协方差矩阵为cov = [[200,0,0,0], ...,但在实际代码中你有cov = [[1,0,0,0],...。尝试修复代码。
  • @WarrenWeckesser 对不起,沃伦,我把 1 改成了 200。

标签: python numpy optimization normal-distribution pyomo


【解决方案1】:

您似乎要求平均值为 -1000 和方差为 1(或者更确切地说,原始问题正在这样做;它似乎已更新为 200,但与 -1003 的观察结果不匹配:-997 稍后说明)。

请注意,我们预计无限群体中 99.9% 的值在 3 sigma 以内(标准差,$\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。

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

【讨论】:

  • 亲爱的 Maximilian,根据您的解释,我是否需要增加方差才能获得预期的结果?
  • @SikSik 是的,我的示例表明,您可以通过使用不同的(更大的)方差(协方差矩阵的对角项)来实现所需的分布分布。
猜你喜欢
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
相关资源
最近更新 更多