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])
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
python中hasattr()、getattr()、setattr()函数的使用
这篇文章主要介绍了python中hasattr()、getattr()、setattr()函数的使用方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2019-08-08keras 两种训练模型方式详解fit和fit_generator(节省内存)
这篇文章主要介绍了keras 两种训练模型方式详解fit和fit_generator(节省内存),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-07-07
最新评论