【Python】numpy.random.seed()和numpy.random.RandomState()区别

前言

在使用深度学习处理数据数,为了保证样本的随机分布和实验的可复现性,经常会使用到numpy.random.seed()和numpy.random.RandomState()两个函数,这个两个函数有什么用法和区别?

numpy.random.seed()

有个博主介绍的非常棒:

seed()里的数字就相当于设置了一个盛有随机数的“聚宝盆”,一个数字代表一个“聚宝盆”。当在seed()的括号里设置相同的seed,“聚宝盆”就是一样的,当然每次拿出的随机数就会相同。如果不设置seed,则每次会生成不同的随机数,但是有时候明明设置了seed()没有变,生成的随机数组还是不同。

意思是说,seed()函数中是可以传入整型数字,程序会根据输入的数字产生一组随机数,只要保证传入的数字持续不变,那么产生的随机数也是固定不变的,如下代码:

np.random.seed(2)
print(np.random.rand(10))
[0.4359949  0.02592623 0.54966248 0.43532239 0.4203678  0.33033482
 0.20464863 0.61927097 0.29965467 0.26682728]
 
np.random.seed(2)
print(np.random.rand(10))
[0.4359949  0.02592623 0.54966248 0.43532239 0.4203678  0.33033482
 0.20464863 0.61927097 0.29965467 0.26682728]

但是有一种情况需要注意:

np.random.seed(2)
print(np.random.rand(10))
[0.4359949  0.02592623 0.54966248 0.43532239 0.4203678  0.33033482
 0.20464863 0.61927097 0.29965467 0.26682728]
 
print(np.random.rand(10))
[0.62113383 0.52914209 0.13457995 0.51357812 0.18443987 0.78533515
 0.85397529 0.49423684 0.84656149 0.07964548]

第二个的np.random.rand(2)已经不是在你设置的np.random.seed(2)下了,所以第二个的随机数组只是在默认random下随机挑选的样本数值。

numpy.random.RandomState()

numpy.random.RandomState()是一个伪随机数生成器。那么伪随机数是什么呢?

伪随机数是用确定性的算法计算出来自[0,1]均匀分布的随机数序列。并不真正的随机,但具有类似于随机数的统计特征,如均匀性、独立性等。在计算伪随机数时,若使用的初值(种子)不变,那么伪随机数的数序也不变。伪随机数可以用计算机大量生成,在模拟研究中为了提高模拟效率,一般采用伪随机数代替真正的随机数。模拟中使用的一般是循环周期极长并能通过随机数检验的伪随机数,以保证计算结果的随机性。

传入相同的seed,产生相同的随机数,如下代码:

import numpy as np
rng = np.random.RandomState(2)
rng.rand(5)
Out[10]: array([0.4359949 , 0.02592623, 0.54966248, 0.43532239, 0.4203678 ])

rng = np.random.RandomState(2)
rng.rand(5)
Out[11]: array([0.4359949 , 0.02592623, 0.54966248, 0.43532239, 0.4203678 ])

因为是伪随机数,所以必须在rng这个变量下使用,如果不这样做,那么就得不到相同的随机数组了,即便再次输入了numpy.random.RandomState(),如下代码:

np.random.RandomState(2)
np.random.rand(5)
Out[12]: array([0.50524609, 0.0652865 , 0.42812233, 0.09653092, 0.12715997])

np.random.RandomState(2)
np.random.rand(5)
Out[13]: array([0.59674531, 0.226012  , 0.10694568, 0.22030621, 0.34982629])

同样,和numpy.random.seed()相似,下面情况,第二个的rng.rand(5)已经不是在你设置的np.random.RandomState(2)下了。如下代码:

rng = np.random.RandomState(2)
x = rng.rand(5)
y = rng.rand(5)
print(x)
[0.4359949  0.02592623 0.54966248 0.43532239 0.4203678 ]
print(y)
[0.33033482 0.20464863 0.61927097 0.29965467 0.26682728]

总结

参数:seed
seed可以是一个int,满足0<=seed<=2(32−1),这个条件的int都可以做参数。
seed可以是一个array。
seed可以是None。

用一句话总结numpy.random.seed()和numpy.random.RandomState()的关系:

  • 相同处: 他们的参数都是随机数seed
  • 不同处: numpy.random.RandomState()更为复杂,完全可以代替
  • numpy.random.seed()这条语句 随机数种子seed只有一次有效,在下一次调用产生随机数函数前没有设置seed,则还是产生随机数。

1.如果需要不产生随机数,则需要每次设置numpy.random.seed()。

>>> import numpy
>>> #注意这里是两条语句
>>> numpy.random.seed(0);numpy.random.rand(4)
array([ 0.5488135 ,  0.71518937,  0.60276338,  0.54488318])
>>>numpy.random.seed(0);numpy.random.rand(4)
array([ 0.5488135 ,  0.71518937,  0.60276338,  0.54488318])
>>>numpy.random.seed(0);numpy.random.rand(4)
array([ 0.5488135 ,  0.71518937,  0.60276338,  0.54488318]

2.如果需要每次都产生随机数,则可以将随机数seed设置成None,或者不设置。

>>> import numpy
>>> numpy.random.seed(None)
>>> numpy.random.rand(4)
array([ 0.5488135 ,  0.71518937,  0.60276338,  0.54488318])
>>> numpy.random.rand(4)
array([ 0.4236548 ,  0.64589411,  0.43758721,  0.891773  ])
>>> numpy.random.rand(4)
array([ 0.96366276,  0.38344152,  0.79172504,  0.52889492])

同理,RandomState产生相同数据和不同数据

>>> import numpy
# 产生相同数据
>>> numpy.random.RandomState(0).rand(4)
array([ 0.5488135 ,  0.71518937,  0.60276338,  0.54488318])
>>> numpy.random.RandomState(0).rand(4)
array([ 0.5488135 ,  0.71518937,  0.60276338,  0.54488318])
>>> numpy.random.RandomState(0).rand(4)
array([ 0.5488135 ,  0.71518937,  0.60276338,  0.54488318])

# None 产生不同数据
>>> numpy.random.RandomState(None).rand(4)
array([ 0.5488135 ,  0.71518937,  0.60276338,  0.54488318])
>>> numpy.random.RandomState(None).rand(4)
array([ 0.4236548 ,  0.64589411,  0.43758721,  0.891773  ])
>>> numpy.random.RandomState(None).rand(4)
array([ 0.96366276,  0.38344152,  0.79172504,  0.52889492])

参考链接:
https://blog.csdn.net/weixin_41571493/article/details/80549833
https://blog.csdn.net/weixin_41571493/article/details/80550076
https://blog.csdn.net/dennis_birl/article/details/58321547

你可能感兴趣的:(Python,python)