首页 > 解决方案 > 为什么在使用相同但相反的均值向量和协方差时,两个多法线绘制不匹配?

问题描述

我希望了解为什么当协方差为指数时,为什么从多重正态分布中抽取两个相同但重新排序的平均向量(以及正确重新排序的协方差向量)会有所不同。

这个 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()) 

这种差异是数学上的,还是数字上的,或者完全是其他的东西?

标签: pythonnumpyrandomstatistics

解决方案


这似乎与 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 会被咨询和更新,我选择说(0.7,0,0)现在我要求选择一个随机变量,但是两个值为零,所以不咨询 SEED,因为只有一个结果。因此,选择了 0.7,在翻转的情况下也会发生同样的情况。然而,在它的情​​况下,y0 = np.exp(np.diag([0.7,0.5,0.3]))它是一个不同的故事。在正向和反向设置中,都可以选择 0.7,但在第一种情况下,它是 (E 0.7,1,1),在第二种情况下,它是 (1,1,E 0.7),没有保证第二选择。因此,SEED 将根据这两个不同的向量进行第二次查询和更新,发送 SEED 运行两条完全不同的路径。


推荐阅读