- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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]
What is the difference between using
RandomState
and justseed
when fixing the seeds usingnumpy.random
and why would the latter not reliably work when running in parallel ?
最佳答案
你得到的结果 numpy.random.*
正在发生是因为 竞争条件 . numpy.random.*
仅使用一个全局 PRNG,在没有同步的情况下在所有线程之间共享。由于线程同时并行运行,并且它们对这个全局 PRNG 的访问在它们之间不同步,它们都争先恐后地访问 PRNG 状态(因此 PRNG 的状态可能会在其他线程的背后改变)。为每个线程提供自己的 PRNG ( RandomState
) 解决了这个问题,因为在没有同步的情况下,多个线程不再共享任何状态。
由于您使用的是 NumPy 1.17,您应该知道有一个更好的选择:NumPy 1.17 引入了 new random number generation system ;它使用所谓的位生成器,例如 PCG 和随机生成器,例如新的 numpy.random.Generator
.
这是 proposal to change the RNG policy 的结果,其中指出 numpy.random.*
通常不应再使用函数。这尤其是因为 numpy.random.*
在全局状态上运行。
NumPy 文档现在有关于以下方面的详细信息——
关于python - 为什么 numpy 随机种子没有保持固定但 RandomState 在并行运行时是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59105921/
我希望我的脚本在每次运行脚本时都创建相同的数字数组。之前我使用的是 np.random.seed()。例如: np.random.seed(1) X = np.random.random((3,2))
我使用Python阅读了深度学习的源代码。(Yusuke Sugomori DBN)。我无法理解的意思 numpy_rng = numpy.random.RandomState(1234) 。当我输入
是否有更直接的方式访问RandomState除 np.random..__self__ 之外的导入时创建的对象?两者 np.random._rand和 getattr(np.random, "_ran
我正在学习 Python,我发现了以下代码: rgen = np.random.RandomState(self.random_state) 在这段代码中,self.random_state 是一个i
我已经阅读了文档,但我仍然很难理解 numpy.random.RandomState(0) 或 numpy.random.seed(0) 难道它们都不能确保选择随机值的过程在整个运行过程中是相同且一致
我正在使用 joblib 并行运行蒙特卡罗模拟.然而,我注意到虽然我的种子是固定的,但我的结果一直在变化。但是,当我连续运行该过程时,它如我所料保持不变。 下面我实现了一个小例子,模拟具有较高方差的正
我试图将代码中随机数生成器的状态保存到文件中,然后再将其读回。生成的元组的形式为: tuple(str, 624 uints 的 ndarray, int, int, float) 返回的元组包含以下
我正在尝试从 1e5 个字符串中抽取 1e7 个项目,但出现内存错误。从 1e4 个字符串中抽取 1e6 个项目很好。我在一台有 4GB 内存的 64 位机器上,我认为我不应该在 1e7 时达到任何内
我对在多核上运行时将 np.random.RandomState 与 sklearn.model_selection.RandomizedSearchCV 一起使用的正确方法感到困惑。 我使用Rand
我有一门课,我想用 Numba 加快速度。该类通过简单地使用特定种子创建 NumPy 的 RandomState 实例,为每个实例使用一个“随机数生成器”(因此我可以稍后复制我的工作)。当我使用 Nu
我想用 hashlib 生成的哈希为 numpy.random.RandomState 实例播种,以使伪随机源始终为相同的输入数据生成相同的值。当我尝试这样做时: hash = sha256(some
像 C++ 这样的语言要求程序员设置随机数生成器的种子,否则它的输出将永远相同。但是,像 numpy 这样的库不需要您手动初始化种子。 例如,代码如下: from numpy.random impor
我知道要播种 numpy.random 的随机性并能够重现它,我应该: import numpy as np np.random.seed(1234) 但是什么np.random.RandomStat
我希望能够在 Python 的标准 Random 和 numpy 的 np.random.RandomState 之间来回转换。这两个都使用 Mersenne Twister 算法,因此应该是可能的(
我是一名优秀的程序员,十分优秀!