在使用深度学习处理数据数,为了保证样本的随机分布和实验的可复现性,经常会使用到numpy.random.seed()和numpy.random.RandomState()两个函数,这个两个函数有什么用法和区别?
有个博主介绍的非常棒:
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()是一个伪随机数生成器。那么伪随机数是什么呢?
伪随机数是用确定性的算法计算出来自[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()的关系:
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