Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么不';当使用相同但相反的平均向量和协方差时,两个多法线绘制是否匹配?_Python_Numpy_Random_Statistics - Fatal编程技术网

Python 为什么不';当使用相同但相反的平均向量和协方差时,两个多法线绘制是否匹配?

Python 为什么不';当使用相同但相反的平均向量和协方差时,两个多法线绘制是否匹配?,python,numpy,random,statistics,Python,Numpy,Random,Statistics,我希望能理解为什么当协方差为指数时,具有相同但重新排序的平均向量(以及正确重新排序的协方差向量)的多正态分布的两个绘图不同 该MWE应更好地解释: import numpy as np np.random.seed(10) x0 = [1,2,3] y0 = np.diag([0.3, 0.5, 0.7]) z0 = np.random.multivariate_normal(x0, y0) np.random.seed(10) x1 = [3,2,1] y1 = np.diag([0.7,

我希望能理解为什么当协方差为指数时,具有相同但重新排序的平均向量(以及正确重新排序的协方差向量)的多正态分布的两个绘图不同

该MWE应更好地解释:

import numpy as np
np.random.seed(10)
x0 = [1,2,3]
y0 = np.diag([0.3, 0.5, 0.7])
z0 = np.random.multivariate_normal(x0, y0)

np.random.seed(10)
x1 = [3,2,1]
y1 = np.diag([0.7, 0.5, 0.3])
z1 = np.random.multivariate_normal(x1, y1)

print (np.allclose(z0, np.flip(z1))) # True, as expeceted

np.random.seed(10)
z0 = np.random.multivariate_normal(x0, np.exp(y0))
np.random.seed(10)
z1 = np.random.multivariate_normal(x1, np.exp(y1))

# these are unexpectedly different
print (z0, z1)
print (z0.mean(), z1.mean()) 

这种差异是数学上的,还是数值上的,还是完全其他的?

这似乎与np.exp()无关。比如说,

np.random.seed(11)
y0 = np.exp(y0)
y0[y0==1] = 0
z0 = np.random.multivariate_normal(x0, y0)
np.random.seed(11)
y1 = np.exp(y1)
y1[y1==1] = 0
z1 = np.random.multivariate_normal(x1, y1)
看起来好像它们是更新随机种子值的行和列之间的随机交互。这意味着,如果数组具有非零的非对角项,则会导致行和列的非随机决策是不可逆的,这反过来会在使用随机种子值时形成不同的路径。当我将所有非对角值固定为零时,将生成相同的随机种子值

更新(进一步解释):


这样想,如果我说从
y0=np.diag([0.7,0.5,0.3])
中的一个随机行中选择,那么SEED会被查询和更新,我选择say
(0.7,0,0)
现在我要求选择一个随机变量,但两个值都是零,所以SEED不会被查询,因为只有一个结果。因此,选择0.7,在翻转的情况下也会发生同样的情况。然而,在
y0=np.exp(np.diag([0.7,0.5,0.3])的情况下,情况就不同了。在正向和反向设置中,可以选择0.7,但在第一种情况下,它是a(E0.7,1,1),在第二种情况下,它是a(1,1,E0.7),不保证有第二选择。因此,将根据这两个不同的向量第二次查询和更新种子,将种子发送到两个完全不同的路径。

这听起来不太正确,请参阅内部情况。它只生成N个独立的高斯变量,然后将它们乘以协方差矩阵的逆。我认为不同之处在于,算法任意选取奇异值分解的一侧,这打破了对称性,而正是1的定位造成了差异。这是通过一些选择还是通过一些乘法来实现,只是如何思考问题的程序性差异。结果是一样的。如果您打算投入工作并深入了解代码的细节,请随时发布更详细的答案。:-)谢谢细节对我来说并不太重要,只是想大致了解一下发生了什么(并确保我没有遗漏一些基本的东西)。@ccap89我只是玩了一会儿,觉得我的想法不太正确。这就是说,我会考虑种子和采样值之间的相互作用是一个实现工件,因此不依赖于它,对小的单元测试可能是好的,但不多。more@Sam梅森:我同意。我几乎可以说这是一个bug,是一个意外的行为。一般来说,人们不应该希望在RNG中发生碰撞;i、 例如,从两个不同的起点开始,但以相同的结果结束。这通常被认为是一个bug。