gpt4 book ai didi

python - scipy.stats 是否为不同的计算机硬件产生不同的随机数?

转载 作者:太空狗 更新时间:2023-10-30 01:10:57 25 4
gpt4 key购买 nike

我遇到了一个问题,尽管我在不同的计算机上得到了不同的随机数

  • scipy.__version__ == '1.2.1' 在所有计算机上
  • numpy.__version__ == '1.15.4' 在所有计算机上
  • random_state seed 在每个生成随机数的函数调用中固定为相同的数字 (42) 以获得可重现的结果

代码有点复杂,无法在此处完整发布,但我注意到当从多元正态中采样时,结果开始出现差异:

import numpy as np
from scipy import stats
seed = 42
n_sim = 1000000
d = corr_mat.shape[0] # corr_mat is a 15x15 correlation matrix, numpy.ndarray
# results diverge from here across different hardware
z = stats.multivariate_normal(mean=np.zeros(d), cov=corr_mat).rvs(n_sim, random_state=seed)

corr_mat 是一个相关矩阵(见下面的附录)并且在所有计算机上都相同。

我们正在测试的两台不同的计算机是

计算机 1


  • 操作系统:Windows 7
  • 处理器:Intel(R) Xeon(R) CPU E5-2623 v4 @ 2.60Ghz 2.60 Ghz(2 个处理器)
  • 内存:64GB
  • 系统类型:64位

计算机 2


  • 操作系统:Windows 7
  • 处理器:Intel(R) Xeon(R) CPU E5-2660 v3 @ 2.10Ghz 2.10 Ghz(2 个处理器)
  • 内存:64GB
  • 系统类型:64位

附录

corr_mat
>>> array([[1. , 0.15, 0.25, 0.25, 0.25, 0.25, 0.1 , 0.1 , 0.1 , 0.25, 0.25,
0.25, 0.1 , 0.1 , 0.1 ],
[0.15, 1. , 0. , 0. , 0. , 0. , 0.15, 0.05, 0.15, 0.15, 0.15,
0. , 0.15, 0.15, 0.15],
[0.25, 0. , 1. , 0.25, 0.25, 0.25, 0.2 , 0. , 0.2 , 0.2 , 0.2 ,
0.25, 0.2 , 0.2 , 0.2 ],
[0.25, 0. , 0.25, 1. , 0.25, 0.25, 0.2 , 0. , 0.2 , 0.2 , 0.2 ,
0.25, 0.2 , 0.2 , 0.2 ],
[0.25, 0. , 0.25, 0.25, 1. , 0.25, 0.2 , 0. , 0.2 , 0.2 , 0.2 ,
0.25, 0.2 , 0.2 , 0.2 ],
[0.25, 0. , 0.25, 0.25, 0.25, 1. , 0.2 , 0. , 0.2 , 0.2 , 0.2 ,
0.25, 0.2 , 0.2 , 0.2 ],
[0.1 , 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 1. , 0.15, 0.25, 0.25, 0.25,
0.2 , 0.25, 0.25, 0.25],
[0.1 , 0.05, 0. , 0. , 0. , 0. , 0.15, 1. , 0.15, 0.15, 0.15,
0. , 0.15, 0.15, 0.15],
[0.1 , 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 1. , 0.25, 0.25,
0.2 , 0.25, 0.25, 0.25],
[0.25, 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 0.25, 1. , 0.25,
0.2 , 0.25, 0.25, 0.25],
[0.25, 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 0.25, 0.25, 1. ,
0.2 , 0.25, 0.25, 0.25],
[0.25, 0. , 0.25, 0.25, 0.25, 0.25, 0.2 , 0. , 0.2 , 0.2 , 0.2 ,
1. , 0.2 , 0.2 , 0.2 ],
[0.1 , 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 0.25, 0.25, 0.25,
0.2 , 1. , 0.25, 0.25],
[0.1 , 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 0.25, 0.25, 0.25,
0.2 , 0.25, 1. , 0.25],
[0.1 , 0.15, 0.2 , 0.2 , 0.2 , 0.2 , 0.25, 0.15, 0.25, 0.25, 0.25,
0.2 , 0.25, 0.25, 1. ]])

最佳答案

以下是有根据的猜测,我无法验证,因为我没有多台机器。

从相关的多正态采样通常是通过从不相关的标准正态采样然后乘以协方差矩阵的“平方根”来完成的。如果我使用 identity(15) 作为协方差然后乘以 l*sqrt(d ) 其中 l,d,r = np.linalg.svd(covariance)

我认为 SVD 足够复杂,可以解释平台之间的微小差异。

这个滚雪球如何成为重要的东西?

我认为您选择的协方差矩阵是罪魁祸首,因为它具有非唯一的特征值。因此 SVD 不是唯一的,因为给定多个特征值的特征空间可以旋转。这有可能极大地放大一个小的数值差异。

如果您使用具有唯一特征值的不同协方差矩阵进行测试,看看您看到的差异是否持续存在会很有趣。

编辑:

作为引用,这是我为您的较小 (6D) 示例尝试的方法:

>>> cm6 = np.array([[1,.5,.15,.15,0,0], [.5,1,.15,.15,0,0],[.15,.15,1,.25,0,0],[.15,.15,.25,1,0,0],[0,0,0,0,1,.1],[0,0,0,0,.1,1]])
>>> ls6,ds6,rs6 = np.linalg.svd(cm6)
>>> np.random.seed(42)
>>> cs6 = stats.multivariate_normal(cov=cm6).rvs()
>>> np.random.seed(42)
>>> is6 = stats.multivariate_normal(cov=np.identity(6)).rvs()
>>> LS6 = ls6*np.sqrt(ds6)
>>> np.allclose(cs6, LS6@is6)
True

正如您报告的那样,问题仍然存在于唯一的特征值中,这是另一种可能性。上面我使用了 svd 来计算特征向量/值,这是可以的,因为 cov 是对称的。如果我们改用 eigh 会怎样?

>>> de6,le6 = np.linalg.eigh(cm6)
>>> LE6 = le6*np.sqrt(de6)
>>> cs6
array([-0.00364915, -0.23778611, -0.50111166, -0.7878898 , -0.91913994,
1.12421904])
>>> LE6@is6
array([ 0.54338614, 1.04010029, -0.71379193, -0.88313042, -0.60813547,
0.26082989])

这些是不同的。为什么?首先,eigh 以相反的方式对特征空间进行排序:

>>> ds6
array([1.7 , 1.1 , 1.05, 0.9 , 0.75, 0.5 ])
>>> de6
array([0.5 , 0.75, 0.9 , 1.05, 1.1 , 1.7 ])

这能解决问题吗?差不多。

>>> LE6[:, ::-1]@is6
array([-0.00364915, -0.23778611, -0.50111166, -0.7878898 , -1.12421904,
0.91913994])

我们看到最后两个样本被交换了,它们的符号也翻转了。原来这是因为一个特征向量的符号被反转了。

因此,即使对于唯一的特征值,由于 (1) 特征空间的阶数和 (2) 特征向量的符号中的歧义,我们也会得到很大的差异。

关于python - scipy.stats 是否为不同的计算机硬件产生不同的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54984058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com