Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說明
前言
在使用深度學(xué)習(xí)處理數(shù)據(jù)數(shù),為了保證樣本的隨機(jī)分布和實(shí)驗(yàn)的可復(fù)現(xiàn)性,經(jīng)常會使用到numpy.random.seed()和numpy.random.RandomState()兩個函數(shù),這個兩個函數(shù)有什么用法和區(qū)別?
numpy.random.seed()
有個博主介紹的非常棒:
- seed()里的數(shù)字就相當(dāng)于設(shè)置了一個盛有隨機(jī)數(shù)的“聚寶盆”,一個數(shù)字代表一個“聚寶盆”。
- 當(dāng)在seed()的括號里設(shè)置相同的seed,“聚寶盆”就是一樣的,當(dāng)然每次拿出的隨機(jī)數(shù)就會相同。
- 如果不設(shè)置seed,則每次會生成不同的隨機(jī)數(shù),但是有時(shí)候明明設(shè)置了seed()沒有變,生成的隨機(jī)數(shù)組還是不同。
意思是說,seed()函數(shù)中是可以傳入整型數(shù)字,程序會根據(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]
第二個的np.random.rand(2)已經(jīng)不是在你設(shè)置的np.random.seed(2)下了,所以第二個的隨機(jī)數(shù)組只是在默認(rèn)random下隨機(jī)挑選的樣本數(shù)值。
numpy.random.RandomState()
numpy.random.RandomState()是一個偽隨機(jī)數(shù)生成器。
那么偽隨機(jī)數(shù)是什么呢?
- 偽隨機(jī)數(shù)是用確定性的算法計(jì)算出來自[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)周期極長并能通過隨機(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這個變量下使用,如果不這樣做,那么就得不到相同的隨機(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()相似,下面情況,第二個的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可以是一個int,滿足0<=seed<=2(32−1),這個條件的int都可以做參數(shù)。
- seed可以是一個array。
- seed可以是None。
用一句話總結(jié)numpy.random.seed()和numpy.random.RandomState()的關(guān)系:
- 相同處: 他們的參數(shù)都是隨機(jī)數(shù)seed
- 不同處: numpy.random.RandomState()更為復(fù)雜,完全可以代替
- numpy.random.seed()這條語句 隨機(jī)數(shù)種子seed只有一次有效,在下一次調(diào)用產(chǎn)生隨機(jī)數(shù)函數(shù)前沒有設(shè)置seed,則還是產(chǎn)生隨機(jī)數(shù)。
1.如果需要不產(chǎn)生隨機(jī)數(shù),則需要每次設(shè)置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.如果需要每次都產(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])
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)全角半角字符互轉(zhuǎn)的方法
大家都知道在自然語言處理過程中,全角、半角的的不一致會導(dǎo)致信息抽取不一致,因此需要統(tǒng)一。這篇文章通過示例代碼給大家詳細(xì)的介紹了Python實(shí)現(xiàn)全角半角字符互轉(zhuǎn)的方法,有需要的朋友們可以參考借鑒,下面跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11
在Python 中同一個類兩個函數(shù)間變量的調(diào)用方法
今天小編就為大家分享一篇在Python 中同一個類兩個函數(shù)間變量的調(diào)用方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
在TensorFlow中實(shí)現(xiàn)矩陣維度擴(kuò)展
這篇文章主要介紹了在TensorFlow中實(shí)現(xiàn)矩陣維度擴(kuò)展方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
C#返回當(dāng)前系統(tǒng)所有可用驅(qū)動器符號的方法
這篇文章主要介紹了C#返回當(dāng)前系統(tǒng)所有可用驅(qū)動器符號的方法,涉及C#操作系統(tǒng)硬件驅(qū)動的相關(guān)技巧,需要的朋友可以參考下2015-04-04
Python實(shí)現(xiàn)簡易的圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)簡易的圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
python Tkinter版學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python Tkinter版學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02

