我运行蒙特卡罗模拟并行使用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)
Run Code Online (Sandbox Code Playgroud)
我串联实现的第一个示例- 结果都与预期相同。
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]
Run Code Online (Sandbox Code Playgroud)
我在 Parallel 中实现的第二个例子:(注意有时手段是一样的,其他时候不一样)
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]
Run Code Online (Sandbox Code Playgroud)
我希望并行运行与固定种子相同。我发现如果我实施RandomState修复种子似乎可以解决问题:
def _estimate_mean():
local_state …Run Code Online (Sandbox Code Playgroud) 尝试使用 curve_fit (scipy API,用于拟合 sigmoid)和 numpy 的固定种子,但结果仍然有所不同。有没有办法让它完全确定性?
根据评论中的要求,这是一个最小的工作示例:
from scipy.optimize import curve_fit
import numpy as np
def sigmoid(x, b, mu, max_kr):
if isinstance(x, list) or isinstance(x, np.ndarray):
return [sigmoid(xx, b, mu, max_kr) for xx in x]
else:
return max_kr/(1+10**(mu*(-x+b)))
def fit_sigmoid(points):
xs, ys = list(zip(*points))
err = None
popt, pcov = curve_fit(sigmoid, xs, ys, bounds=([-np.inf, 0, 0], [np.inf, np.inf, 1]), ftol=len(xs)*1e-6)
b, mu, max_kr = popt
return mu
np.random.seed = 12
points1 = [(4.0, 1.0), (1.0, 8.340850913002296e-05), (3.0, 0.9793319563421965), (0.0, …Run Code Online (Sandbox Code Playgroud)