【发布时间】:2020-03-25 02:50:05
【问题描述】:
我正在使用 joblib 并行运行 蒙特卡罗模拟。然而,我注意到虽然我的种子是固定的,但我的结果一直在变化。但是,当我按顺序运行该过程时,它保持不变。
下面我实现了一个小例子,模拟具有较高方差的正态分布的均值。
加载库并定义函数
import numpy as np
from joblib import Parallel, delayed
def _estimate_mean():
np.random.seed(0)
x = np.random.normal(0, 2, size=100)
return np.mean(x)
我系列实现的第一个示例 - 结果都与预期相同。
tst = [_estimate_mean() for i in range(8)]
In [28]: tst
Out[28]:
[0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897]
我并行实现的第二个例子:(注意有时手段都是一样的,其他时候不是)
tst = Parallel(n_jobs=-1, backend="threading")(delayed(_estimate_mean)() for i in range(8))
In [26]: tst
Out[26]:
[0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897,
0.1640259414956747,
-0.11846452111932627,
-0.3935934130918206]
我希望并行运行与固定种子相同。我发现如果我实施RandomState 来修复种子,它似乎可以解决问题:
def _estimate_mean():
local_state = np.random.RandomState(0)
x = local_state.normal(0, 2, size=100)
return np.mean(x)
tst = Parallel(n_jobs=-1, backend="threading")(delayed(_estimate_mean)() for i in range(8))
In [28]: tst
Out[28]:
[0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897,
0.11961603106897]
在使用
numpy.random修复种子时,使用RandomState和仅使用seed有什么区别,为什么后者在并行运行时不能可靠地工作?
系统信息
操作系统:Windows 10
Python:3.7.3(默认,2019 年 4 月 24 日,15:29:51)[MSC v.1915 64 位 (AMD64)]
Numpy:1.17.2
【问题讨论】:
-
有一个很好的讨论:stackoverflow.com/questions/5836335/…,请检查答案的 cmets,真的很有帮助。另一个答案:stackoverflow.com/questions/37224116/…
-
可能是没有为每个线程重置种子
标签: python numpy parallel-processing random-seed