python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > numpy.random.seed()和numpy.random.RandomState()区别

Python之numpy.random.seed()和numpy.random.RandomState()区别及说明

作者:pangpd

这篇文章主要介绍了Python之numpy.random.seed()和numpy.random.RandomState()区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

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

numpy.random.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()是一个伪随机数生成器。

那么伪随机数是什么呢?

传入相同的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

用一句话总结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])

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文