np.random.seed() 和 np.random.RandomState() 之间的区别
Posted
技术标签:
【中文标题】np.random.seed() 和 np.random.RandomState() 之间的区别【英文标题】:Difference between np.random.seed() and np.random.RandomState() 【发布时间】:2014-05-24 12:52:45 【问题描述】:我知道要播种 numpy.random 的随机性并能够重现它,我应该:
import numpy as np
np.random.seed(1234)
但是什么
np.random.RandomState()
怎么办?
【问题讨论】:
另见:***.com/q/37224116/562769 这是一个非常好的讨论:***.com/questions/5836335/… 你真的必须在 cmets 中跋涉并注意 Robert Kern 是一个 numpy 开发者 【参考方案1】:random.seed 是一种填充random.RandomState 容器的方法。
来自 numpy 文档:
numpy.random.seed(seed=None)
播种生成器。
该方法在 RandomState 初始化时被调用。可以再次调用它来重新播种生成器。有关详细信息,请参阅 RandomState。
class numpy.random.RandomState
Mersenne Twister 伪随机数生成器的容器。
【讨论】:
但如果我调用 RandomState(1234) 并使用 random.uniform() 创建一个数字,则结果不可重现。 RandomState 之类的容器是用来做什么的? @eran 你知道Mersenne twister 和Uniform distribution 不是一回事吗?请阅读this 以了解更多关于random.RandomState 的信息。 @eran,实际上是因为您正在创建该类的另一个实例。请参阅我的答案以了解如何使用它。 谢谢!我现在明白了。很直接。该文档只是缺少一个适当的示例。或者我有一个盲点......【参考方案2】:如果要设置调用np.random...
将使用的种子,请使用np.random.seed
:
np.random.seed(1234)
np.random.uniform(0, 10, 5)
#array([ 1.9151945 , 6.22108771, 4.37727739, 7.85358584, 7.79975808])
np.random.rand(2,3)
#array([[ 0.27259261, 0.27646426, 0.80187218],
# [ 0.95813935, 0.87593263, 0.35781727]])
使用类来避免影响全局 numpy 状态:
r = np.random.RandomState(1234)
r.uniform(0, 10, 5)
#array([ 1.9151945 , 6.22108771, 4.37727739, 7.85358584, 7.79975808])
并且它像以前一样保持状态:
r.rand(2,3)
#array([[ 0.27259261, 0.27646426, 0.80187218],
# [ 0.95813935, 0.87593263, 0.35781727]])
您可以通过以下方式查看“全局”类的状态:
np.random.get_state()
和你自己的类实例:
r.get_state()
【讨论】:
你的回答很有道理。但是文档如何不令人困惑?This method is called when RandomState is initialized. It can be called again to re-seed the generator.
它没有说明当我调用此方法时,我只影响一个全局实例(或其他),而不影响任何其他 RandomState
实例。
是的,我同意..numpy.random
模块文档应该清楚地说明该模块是使用RandomState
的有效实例初始化的。但是我找不到任何关于模块本身的文档。【参考方案3】:
np.random.RandomState()
构造一个随机数生成器。它对np.random
中的独立函数没有任何影响,但必须显式使用:
>>> rng = np.random.RandomState(42)
>>> rng.randn(4)
array([ 0.49671415, -0.1382643 , 0.64768854, 1.52302986])
>>> rng2 = np.random.RandomState(42)
>>> rng2.randn(4)
array([ 0.49671415, -0.1382643 , 0.64768854, 1.52302986])
【讨论】:
对独立功能有什么影响?我认为它像我的回答一样创建了一个独立的实例。 @askewchan:错字,我的意思是它没有有任何效果。【参考方案4】:np.random.RandomState() - 一个基于不同概率分布提供多种方法的类。 np.random.RandomState.seed() - 在 RandomState() 初始化时调用。
【讨论】:
欢迎来到 SO!感谢您花时间回答这个问题。您能否提供有关您的解决方案的更多详细信息?例如,为什么您的解决方案比公认的答案更好?此外,这个问题是在 6 年前提出并回答的。回答时请务必查看原始问题的日期。请阅读How to Answer。【参考方案5】:Seed
是一个全局伪随机生成器。但是randomstate
是一个伪随机生成器,与其他生成器隔离,只影响特定变量。
rng = np.random.RandomState(0)
rng.rand(4)
# Out[1]: array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])
rng = np.random.RandomState(0)
rng.rand(4)
# Out[2]: array([0.5488135 , 0.71518937, 0.60276338, 0.54488318])
基本上和Seed
一样,但是如下,我们不给变量赋值randomstate。
np.random.RandomState(0)
# Out[3]: <mtrand.RandomState at 0xddaa288>
np.random.rand(4)
# Out[4]: array([0.62395295, 0.1156184 , 0.31728548, 0.41482621])
np.random.RandomState(0)
# Out[5]: <mtrand.RandomState at 0xddaac38>
np.random.rand(4)
# Out[6]: array([0.86630916, 0.25045537, 0.48303426, 0.98555979])
后者与前者不同。这意味着随机状态仅在特定变量内有效。
【讨论】:
以上是关于np.random.seed() 和 np.random.RandomState() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章