np.random.seed在Scikit-Learn教程的下面代码中做了什么?我对NumPy的随机状态生成器的东西不太熟悉,所以我真的很感谢外行人的术语解释.
np.random.seed(0)
indices = np.random.permutation(len(iris_X))
Run Code Online (Sandbox Code Playgroud)
Joh*_*024 449
np.random.seed(0) 使随机数可预测
>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55, 0.72, 0.6 , 0.54])
>>> numpy.random.seed(0) ; numpy.random.rand(4)
array([ 0.55, 0.72, 0.6 , 0.54])
Run Code Online (Sandbox Code Playgroud)
种子重置(每次),每次都会出现相同的数字组.
如果未重置随机种子,则每次调用都会显示不同的数字:
>>> numpy.random.rand(4)
array([ 0.42, 0.65, 0.44, 0.89])
>>> numpy.random.rand(4)
array([ 0.96, 0.38, 0.79, 0.53])
Run Code Online (Sandbox Code Playgroud)
(伪)随机数通过从数字(种子)开始,将其乘以大数,然后取该产品的模数来工作.然后将得到的数字用作种子以生成下一个"随机"数字.当你设置种子(每次)时,它每次都会做同样的事情,给你相同的数字.
如果您想要看似随机的数字,请不要设置种子.但是,如果您的代码使用了要调试的随机数,那么在每次运行之前设置种子非常有用,这样每次运行时代码都会执行相同的操作.
要获得每次运行的最随机数,请致电numpy.random.seed(). 这将导致numpy将种子设置为从/dev/urandomWindows模拟或其Windows模拟获得的随机数,或者,如果这两者都不可用,它将使用时钟.
小智 31
如果你np.random.seed(a_fixed_number)每次调用numpy的其他随机函数时设置,结果将是相同的:
>>> import numpy as np
>>> np.random.seed(0)
>>> perm = np.random.permutation(10)
>>> print perm
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0)
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0)
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0)
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0)
>>> print np.random.rand(4)
[0.5488135 0.71518937 0.60276338 0.54488318]
>>> np.random.seed(0)
>>> print np.random.rand(4)
[0.5488135 0.71518937 0.60276338 0.54488318]
Run Code Online (Sandbox Code Playgroud)
但是,如果您只调用一次并使用各种随机函数,结果仍然会有所不同:
>>> import numpy as np
>>> np.random.seed(0)
>>> perm = np.random.permutation(10)
>>> print perm
[2 8 4 9 1 6 7 3 0 5]
>>> np.random.seed(0)
>>> print np.random.permutation(10)
[2 8 4 9 1 6 7 3 0 5]
>>> print np.random.permutation(10)
[3 5 1 2 9 8 0 6 7 4]
>>> print np.random.permutation(10)
[2 3 8 4 5 1 0 6 9 7]
>>> print np.random.rand(4)
[0.64817187 0.36824154 0.95715516 0.14035078]
>>> print np.random.rand(4)
[0.87008726 0.47360805 0.80091075 0.52047748]
Run Code Online (Sandbox Code Playgroud)
ntg*_*ntg 16
如上所述,numpy.random.seed(0)将随机种子设置为0,因此从随机获得的伪随机数将从同一个点开始.在某些情况下,这可能适用于调试.但是,经过一些阅读后,这似乎是错误的方法,如果你有线程,因为它不是线程安全的.
从numpy-random-random-random-random-random-python中的差异:
对于numpy.random.seed(),主要的困难是它不是线程安全的 - 也就是说,如果你有许多不同的执行线程,它是不安全的,因为如果两个不同的线程正在执行它不能保证工作这个功能同时进行.如果您没有使用线程,并且如果您可以合理地预期将来不需要以这种方式重写程序,那么numpy.random.seed()应该可以用于测试目的.如果有任何理由怀疑将来可能需要线程,那么从长远来看,按照建议做的更安全,并且创建numpy.random.Random类的本地实例.据我所知,random.random.seed()是线程安全的(或者至少,我没有发现任何相反的证据).
如何解决这个问题的例子:
from numpy.random import RandomState
prng = RandomState()
print prng.permutation(10)
prng = RandomState()
print prng.permutation(10)
prng = RandomState(42)
print prng.permutation(10)
prng = RandomState(42)
print prng.permutation(10)
Run Code Online (Sandbox Code Playgroud)
可能会给:
[3 0 4 6 8 2 1 9 7 5]
[1 6 9 0 2 7 8 3 5 4]
[8 1 5 0 7 2 9 4 3 6]
[8 1 5 0 7 2 9 4 3 6]
最后,请注意,由于xor的工作方式,可能会出现初始化为0(与没有所有位0的种子相反)可能导致少数第一次迭代的非均匀分布的情况,但这取决于算法,并且超出了我目前的担忧和这个问题的范围.
小智 16
我希望给出一个非常简短的答案:
seed使(下一个系列)随机数可预测。你可以想,每次调用后seed,它都会预先定义序列号,并且 numpy random 保留它的迭代器,然后每次你得到一个随机数时,它都会调用 get next 。
例如:
np.random.seed(2)
np.random.randn(2) # array([-0.41675785, -0.05626683])
np.random.randn(1) # array([-1.24528809])
np.random.seed(2)
np.random.randn(1) # array([-0.41675785])
np.random.randn(2) # array([-0.05626683, -1.24528809])
Run Code Online (Sandbox Code Playgroud)
您可以注意到,当我设置相同的种子时,无论您每次从 numpy 请求多少个随机数,它总是给出相同的数字序列,在本例中为array([-0.41675785, -0.05626683, -1.24528809])。
A S*_*sh 5
我在神经网络中经常使用它。众所周知,当我们开始训练神经网络时,我们会随机初始化权重。在特定数据集上对这些权重训练模型。经过数个时期后,您将获得一组训练有素的权重。
现在,假设您要从头开始再次训练,或者想将模型传递给其他人来重现您的结果,权重将再次初始化为一个随机数,该数字与以前的数字大不相同。在与先前相同的时期(保持相同的数据和其他参数)之后,获得的训练权重将有所不同。问题在于您的模型不再具有可复制性,因为每次您从头开始训练模型时,模型都会提供不同的权重集。这是因为每次都会用不同的随机数初始化模型。
如果每次您从头开始训练时都将模型初始化为同一组随机初始化权重,该怎么办?在这种情况下,您的模型可以重现。这是通过numpy.random.seed(0)实现的。通过将seed()提到特定的数字,您将始终挂在同一组随机数上。
小智 5
np.random.seed()上面的所有答案都显示了代码中的实现。我将尽力简要解释为什么会发生这种情况。计算机是根据预定义算法设计的机器。计算机的任何输出都是对输入执行算法的结果。因此,当我们要求计算机生成随机数时,它们肯定是随机的,但计算机并不是随机产生的!
因此,当我们编写np.random.seed(any_number_here)算法时,将输出参数唯一的一组特定数字any_number_here。这几乎就像如果我们传递正确的参数就可以获得一组特定的随机数。但这需要我们了解算法是如何工作的,这是相当乏味的。
因此,例如,如果我写出np.random.seed(10)一组特定的数字,即使我在 10 年后执行同一行,我获得的数字也将保持不变,除非算法发生变化。
| 归档时间: |
|
| 查看次数: |
221003 次 |
| 最近记录: |