Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說(shuō)明
前言
在使用深度學(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)文章
python中hasattr()、getattr()、setattr()函數(shù)的使用
這篇文章主要介紹了python中hasattr()、getattr()、setattr()函數(shù)的使用方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08python數(shù)據(jù)類型_字符串常用操作(詳解)
下面小編就為大家?guī)?lái)一篇python數(shù)據(jù)類型_字符串常用操作(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05python雙向鏈表實(shí)現(xiàn)實(shí)例代碼
python雙向鏈表和單鏈表類似,只不過(guò)是增加了一個(gè)指向前面一個(gè)元素的指針,下面的代碼實(shí)例了python雙向鏈表的方法2013-11-11在Django下測(cè)試與調(diào)試REST API的方法詳解
今天小編就為大家分享一篇在Django下測(cè)試與調(diào)試REST API的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08python基礎(chǔ)學(xué)習(xí)之生成器與文件系統(tǒng)知識(shí)總結(jié)
本文是參考《python數(shù)據(jù)分析》的附錄對(duì)生成器和文件系統(tǒng)結(jié)合案例的一個(gè)簡(jiǎn)單回顧,文中對(duì)python生成器與文件系統(tǒng)作了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05keras 兩種訓(xùn)練模型方式詳解fit和fit_generator(節(jié)省內(nèi)存)
這篇文章主要介紹了keras 兩種訓(xùn)練模型方式詳解fit和fit_generator(節(jié)省內(nèi)存),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07Python pydotplus安裝及可視化圖形創(chuàng)建教程
這篇文章主要為大家介紹了Python pydotplus安裝及可視化圖形創(chuàng)建教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10