欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說(shuō)明

 更新時(shí)間:2024年06月13日 11:20:06   作者:pangpd  
這篇文章主要介紹了Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

在使用深度學(xué)習(xí)處理數(shù)據(jù)數(shù),為了保證樣本的隨機(jī)分布和實(shí)驗(yàn)的可復(fù)現(xiàn)性,經(jīng)常會(huì)使用到numpy.random.seed()和numpy.random.RandomState()兩個(gè)函數(shù),這個(gè)兩個(gè)函數(shù)有什么用法和區(qū)別?

numpy.random.seed()

有個(gè)博主介紹的非常棒:

  • seed()里的數(shù)字就相當(dāng)于設(shè)置了一個(gè)盛有隨機(jī)數(shù)的“聚寶盆”,一個(gè)數(shù)字代表一個(gè)“聚寶盆”。
  • 當(dāng)在seed()的括號(hào)里設(shè)置相同的seed,“聚寶盆”就是一樣的,當(dāng)然每次拿出的隨機(jī)數(shù)就會(huì)相同。
  • 如果不設(shè)置seed,則每次會(huì)生成不同的隨機(jī)數(shù),但是有時(shí)候明明設(shè)置了seed()沒(méi)有變,生成的隨機(jī)數(shù)組還是不同。

意思是說(shuō),seed()函數(shù)中是可以傳入整型數(shù)字,程序會(huì)根據(jù)輸入的數(shù)字產(chǎn)生一組隨機(jī)數(shù),只要保證傳入的數(shù)字持續(xù)不變,那么產(chǎn)生的隨機(jī)數(shù)也是固定不變的,如下代碼:

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]

第二個(gè)的np.random.rand(2)已經(jīng)不是在你設(shè)置的np.random.seed(2)下了,所以第二個(gè)的隨機(jī)數(shù)組只是在默認(rèn)random下隨機(jī)挑選的樣本數(shù)值。

numpy.random.RandomState()

numpy.random.RandomState()是一個(gè)偽隨機(jī)數(shù)生成器。

那么偽隨機(jī)數(shù)是什么呢?

  • 偽隨機(jī)數(shù)是用確定性的算法計(jì)算出來(lái)自[0,1]均勻分布的隨機(jī)數(shù)序列。
  • 并不真正的隨機(jī),但具有類似于隨機(jī)數(shù)的統(tǒng)計(jì)特征,如均勻性、獨(dú)立性等。
  • 在計(jì)算偽隨機(jī)數(shù)時(shí),若使用的初值(種子)不變,那么偽隨機(jī)數(shù)的數(shù)序也不變。偽隨機(jī)數(shù)可以用計(jì)算機(jī)大量生成,在模擬研究中為了提高模擬效率,一般采用偽隨機(jī)數(shù)代替真正的隨機(jī)數(shù)。
  • 模擬中使用的一般是循環(huán)周期極長(zhǎng)并能通過(guò)隨機(jī)數(shù)檢驗(yàn)的偽隨機(jī)數(shù),以保證計(jì)算結(jié)果的隨機(jī)性。

傳入相同的seed,產(chǎn)生相同的隨機(jī)數(shù),如下代碼:

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 ])

因?yàn)槭莻坞S機(jī)數(shù),所以必須在rng這個(gè)變量下使用,如果不這樣做,那么就得不到相同的隨機(jī)數(shù)組了,即便再次輸入了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()相似,下面情況,第二個(gè)的rng.rand(5)已經(jīng)不是在你設(shè)置的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]

總結(jié)

參數(shù):seed

  • seed可以是一個(gè)int,滿足0<=seed<=2(32−1),這個(gè)條件的int都可以做參數(shù)。
  • seed可以是一個(gè)array。
  • seed可以是None。

用一句話總結(jié)numpy.random.seed()和numpy.random.RandomState()的關(guān)系:

  • 相同處: 他們的參數(shù)都是隨機(jī)數(shù)seed
  • 不同處: numpy.random.RandomState()更為復(fù)雜,完全可以代替
  • numpy.random.seed()這條語(yǔ)句 隨機(jī)數(shù)種子seed只有一次有效,在下一次調(diào)用產(chǎn)生隨機(jī)數(shù)函數(shù)前沒(méi)有設(shè)置seed,則還是產(chǎn)生隨機(jī)數(shù)。

1.如果需要不產(chǎn)生隨機(jī)數(shù),則需要每次設(shè)置numpy.random.seed()。

>>> import numpy
>>> #注意這里是兩條語(yǔ)句
>>> 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.如果需要每次都產(chǎn)生隨機(jī)數(shù),則可以將隨機(jī)數(shù)seed設(shè)置成None,或者不設(shè)置。

>>> 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產(chǎn)生相同數(shù)據(jù)和不同數(shù)據(jù)

>>> import numpy
# 產(chǎn)生相同數(shù)據(jù)
>>> 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 產(chǎn)生不同數(shù)據(jù)
>>> 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])

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論