numpy.random.seed(0)是做什么的?
np.random.seed在Scikit-Learn教程的下面代码中做了什么? 我不是很熟悉NumPy的随机状态生成器的东西,所以我非常感谢外行人对此的解释。
np.random.seed(0) indices = np.random.permutation(len(iris_X))
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])
随着种子重置(每次),每次都会出现同一组数字。
如果随机种子没有被重置,每次调用都会出现不同的数字:
>>> 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])
(伪)随机数的工作是从一个数字(种子)开始,将其乘以一个大数,然后取模该产品。 然后将得到的数字用作种子来生成下一个“随机”数字。 当你设定种子(每次),它每次都做同样的事情,给你相同的数字。
如果你想看似随机数字,不要设置种子。 但是,如果您的代码使用了要debugging的随机数,那么在每次运行之前设置种子会非常有帮助,这样每次运行代码时都会执行相同的操作。
要获得每次运行最随机的数字,请调用numpy.random.seed()
。 这将导致numpy将种子设置为从/dev/urandom
或其Windows模拟获得的随机数,或者,如果这两者都不可用,则将使用该时钟。
如果每次调用numpy的其他随机函数时设置np.random.seed(a_fixed_number)
,结果将是相同的:
但是,如果您只调用一次并使用各种随机函数,则结果将会不同:
如上所述,numpy.random.seed(0)将随机种子设置为0,所以从随机获得的伪随机数将从同一点开始。 在某些情况下,这可以很好地进行debugging。 但是,在阅读之后,这似乎是错误的方法,如果你有线程,因为它不是线程安全的。
来自于numpy-random-and-random-in-python之间的区别 :
对于numpy.random.seed(),主要的难点在于它不是线程安全的 – 也就是说,如果你有很多不同的执行线程是不安全的,因为如果两个不同的线程正在执行该function在同一时间。 如果你不使用线程,并且如果你可以合理地预期你将不需要以这种方式重写你的程序,numpy.random.seed()应该是罚款testing的目的。 如果有任何理由怀疑您将来可能需要线程,那么从长远来看,按照build议进行操作并创buildnumpy.random.Random类的本地实例会更安全。 据我所知,random.random.seed()是线程安全的(或至less,我没有find任何相反的证据)。
如何去做这个例子:
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)
可能会给:
[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的种子)可能导致对于一些第一次迭代的非均匀分布,但这取决于algorithm,超出了我目前的担忧和这个问题的范围。
通过使用np.Random.Seed(i),其中'i'可以是任何整数,您可以确保在生成随机数的同时,每次都以不同的顺序生成相同的一组数字,直到提供下一个种子