【问题标题】:Global Seed for Multiple Numpy Imports多个 Numpy 导入的全局种子
【发布时间】:2015-05-28 21:36:44
【问题描述】:

假设我有一个 Python 项目结构为:

main.py 导入 random_initialization.py

main.py 导入 sample_around_solution.py

random_initializationsample_around_solution.py 都导入 numpy

现在, random_initialization 启动一个问题的随机实例,main 运行一个算法,sample_around_solution 使用解决方案周围的随机样本来计算一些度量(比如解决方案的质量)。

我想要运行的可复制性,我在两个导入的文件中都有numpy.random.seed(0)。这是正确的方法吗?我觉得可能存在一些极端情况,这是一个可怕的想法。

【问题讨论】:

    标签: python numpy random


    【解决方案1】:

    我更喜欢让模拟的每个组件都使用自己的随机数生成器。如果每个 Monte Carlo 组件都有自己的模块,并且您想要模块的全局 rng 状态,那么您可以在模块中放置一个初始化函数:

    def init_rng(seed):
        global rng
        rng = numpy.random.RandomState(seed=seed)
    

    然后您可以独立设置和控制每个过程,即

    import componentA
    import componentB
    import componentC
    
    componentA.init_rng(0)
    componentB.init_rng(1)
    componentC.init_rng(2)
    

    如果您不喜欢全局变量,您还可以将随机过程封装在具有 rng 属性和初始化函数的类中。

    如果所有进程共享同一个生成器,那么 processA 的结果可能取决于 processB 生成的数字等...

    【讨论】:

      【解决方案2】:

      我认为最好不要让任何东西操纵随机种子,除了最顶层的模块,它通常是

      • 一个简短的main.py,只是imports,做一些程序选项和配置,并调用其他东西)

      • unittest

      播种的单点允许做一些有用的事情,例如,

      • 您可以控制设置可重复性的种子(如您所写)。

      • 您可以控制改变种子以获得更好的覆盖率(例如,如果您将通过单元测试运行子模块)。

      • 您可以将种子存储在持久存储中,这样如果某些执行出现问题,您可以重现它。

      相反,如果子模块自己播种,则不能。我也认为这是错误的封装:它不是做一些定义明确的功能 X 的模块,而是做 X + 种子。


      顺便说一句,几年前我写了一个tiny library on PyPI - UnittestRandGenStateunittest 做“智能”播种,然后考虑了一下。它基本上依赖于你所提议的内容的缺失。

      【讨论】:

        猜你喜欢
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-02
        • 2017-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多