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

时间:2019-03-04 13:13:18

标签: python numpy random scipy hardware

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

  • scipy.__version__ == '1.2.1'在所有计算机上
  • numpy.__version__ == '1.15.4'在所有计算机上
  • 在每个函数调用中,
  • random_state种子固定为相同的数字(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个处理器)
  • RAM:64 GB
  • 系统类型:64位

计算机2


  • 操作系统:Windows 7
  • 处理器:Intel®Xeon(R) CPU E5-2660 v3 @ 2.10Ghz 2.10 Ghz(2个处理器)
  • RAM:64 GB
  • 系统类型: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.  ]])

1 个答案:

答案 0 :(得分:4)

以下是有根据的猜测,由于我没有多台计算机,因此无法验证。

从相关的多法线进行采样通常是通过从不相关的标准法线进行采样,然后乘以协方差矩阵的“平方根”来完成的。如果我将 public Publish(int ticket, String exchange, String routingKey, boolean mandatory, boolean immediate) { if (exchange == null) throw new IllegalStateException("Invalid configuration: 'exchange' must be non-null."); if (routingKey == null) throw new IllegalStateException("Invalid configuration: 'routingKey' must be non-null."); 用作协方差,然后与identity(15)相乘,其中l*sqrt(d)

我认为SVD足够复杂,无法解释平台之间的细微差别。

这个滚雪球怎么能变成有意义的东西?

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

如果您使用具有独特特征值的不同协方差矩阵进行测试,那么看看您看到的差异是否仍然存在将很有趣。

编辑

作为参考,这是我为您的较小(6D)示例所尝试的:

l,d,r = np.linalg.svd(covariance)

当您报告问题仍然存在时,特征值仍然存在,这是另一种可能性。上面我用>>> 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 来计算特征向量/值,因为cov是对称的,所以可以。如果我们改用svd会怎样?

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 ])

我们看到最后两个样本被交换并且它们的符号被翻转。事实证明,这是由于一个本征矢量的符号被反转了。

因此,即使对于唯一的特征值,由于(1)本征空间的顺序和(2)本征向量的符号不明确,我们也可以得到很大的差异。