機(jī)器學(xué)習(xí)入門系列②|如何在Python中生成隨機(jī)數(shù)
從人工神經(jīng)網(wǎng)絡(luò)中權(quán)重的隨機(jī)初始化,到將數(shù)據(jù)分成隨機(jī)訓(xùn)練集和測試集,再到隨機(jī)梯度下降中訓(xùn)練數(shù)據(jù)集的隨機(jī)混洗,生成隨機(jī)數(shù)和利用隨機(jī)性是一項必備技能。
本文講解了如何在 Python 中生成和使用隨機(jī)數(shù)。完成本教程后,你能夠了解:
這種隨機(jī)性可以通過使用偽隨機(jī)數(shù)生成器應(yīng)用于程序中。
如何通過Python標(biāo)準(zhǔn)庫生成隨機(jī)數(shù)和使用隨機(jī)性。
如何通過NumPy庫生成隨機(jī)數(shù)數(shù)組。
大家先來看下本教程的目錄:
1.偽隨機(jī)數(shù)發(fā)生器
2.Python 標(biāo)準(zhǔn)庫中的隨機(jī)數(shù)
種子隨機(jī)數(shù)生成器
隨機(jī)浮點(diǎn)值
隨機(jī)整數(shù)值
隨機(jī)高斯值
從列表中隨機(jī)選擇
列表中的隨機(jī)子樣本
隨機(jī)打亂列表
3.使用NumPy處理隨機(jī)數(shù)
種子隨機(jī)數(shù)生成器
隨機(jī)浮點(diǎn)值數(shù)組
隨機(jī)整數(shù)值數(shù)組
隨機(jī)高斯值數(shù)組
隨機(jī)排列NumPy數(shù)組
以后自己敲代碼用到這個知識點(diǎn)的時候,按著這個學(xué)習(xí)思路回憶一遍整個知識點(diǎn),加強(qiáng)記憶,能夠培養(yǎng)代碼思維能力。
1. 偽隨機(jī)數(shù)發(fā)生器
我們注入程序和算法的隨機(jī)性來源是一種稱為偽隨機(jī)數(shù)生成器的數(shù)學(xué)技巧。
隨機(jī)數(shù)生成器是一種從真正的隨機(jī)源生成隨機(jī)數(shù)的系統(tǒng)。通常是物理的東西,比如蓋革計數(shù)器,結(jié)果會變成隨機(jī)數(shù)。我們在機(jī)器學(xué)習(xí)中不需要真正的隨機(jī)性。相反,我們可以使用偽隨機(jī)性。偽隨機(jī)性是一個看起來接近隨機(jī)的數(shù)字樣本,但它是使用確定性過程生成的。
混洗數(shù)據(jù)和用隨機(jī)值初始化系數(shù)使用偽隨機(jī)數(shù)生成器。這些小程序通常是一個可以調(diào)用的函數(shù),它會返回一個隨機(jī)數(shù)。再次調(diào)用,他們將返回一個新的隨機(jī)數(shù)。包裝函數(shù)通常也可用,并允許你將隨機(jī)性作為整數(shù)、浮點(diǎn)數(shù)、特定分布內(nèi)、特定范圍內(nèi)等。
數(shù)字是按順序生成的。該序列是確定性的,并以初始數(shù)字作為種子。如果你沒有明確地為偽隨機(jī)數(shù)生成器設(shè)置種子(seed),那么它可能會使用以秒或毫秒為單位的當(dāng)前系統(tǒng)時間作為種子(seed)。
種子的價值并不重要。選擇任何你想要的。重要的是該過程的相同種子將導(dǎo)致相同的隨機(jī)數(shù)序列。
2. Python 標(biāo)準(zhǔn)庫中的隨機(jī)數(shù)
Python標(biāo)準(zhǔn)庫提供了一個名為random的模塊,該模塊提供了一套用于生成隨機(jī)數(shù)的函數(shù)。
Python使用一種流行且強(qiáng)大的偽隨機(jī)數(shù)生成器,稱為Mersenne Twister。
在本節(jié)中,我們將查看一些使用標(biāo)準(zhǔn)Python API生成和使用隨機(jī)數(shù)和隨機(jī)性的用例。
種子隨機(jī)數(shù)生成器
偽隨機(jī)數(shù)生成器是一個數(shù)學(xué)函數(shù),它生成一個幾乎隨機(jī)數(shù)的序列。
它需要一個參數(shù)來啟動序列,稱為種子。該函數(shù)是確定性的,這意味著給定相同的種子,它每次都會產(chǎn)生相同的數(shù)字序列。種子的選擇并不重要。
seed()函數(shù)將播種的偽隨機(jī)數(shù)發(fā)生器,以整數(shù)值作為參數(shù),如1或7。如果seed()函數(shù)之前沒有使用隨機(jī)性調(diào)用時,默認(rèn)是使用當(dāng)前系統(tǒng)時間中從epoch (1970) 開始的毫秒數(shù)。
下面的示例演示了為偽隨機(jī)數(shù)生成器設(shè)置種子,生成一些隨機(jī)數(shù),并顯示為生成器重新設(shè)置種子將導(dǎo)致生成相同的數(shù)字序列。
運(yùn)行示例為偽隨機(jī)數(shù)生成器設(shè)置值為1的種子,生成3個隨機(jī)數(shù),重新設(shè)置生成器的種子,并顯示生成了相同的三個隨機(jī)數(shù)。
通過設(shè)置種子來確保你的代碼每次產(chǎn)生相同的結(jié)果來控制隨機(jī)性非常有用,例如在生產(chǎn)模型中。
對于使用隨機(jī)化來控制混雜變量的運(yùn)行實驗,可以為每個實驗運(yùn)行使用不同的種子。
隨機(jī)浮點(diǎn)值
可以使用random()函數(shù)生成隨機(jī)浮點(diǎn)值。值將在0和1之間的范圍內(nèi)生成,特別是在區(qū)間 [0,1] 中。
值是從均勻分布中抽取的,這意味著每個值被抽取的機(jī)會均等。
下面的示例生成10個隨機(jī)浮點(diǎn)值。
運(yùn)行示例生成并打印每個隨機(jī)浮點(diǎn)值。
通過將浮點(diǎn)值乘以新范圍的大小并添加最小值,可以將浮點(diǎn)值重新縮放到所需范圍,如下所示:
其中min和max分別是所需范圍的最小值和最大值,value是在0和1之間的范圍內(nèi)隨機(jī)生成的浮點(diǎn)值。
隨機(jī)整數(shù)值
可以使用randint()函數(shù)生成隨機(jī)整數(shù)值。
此函數(shù)采用兩個參數(shù):生成的整數(shù)值范圍的開始和結(jié)束。隨機(jī)整數(shù)是在范圍值的開始和結(jié)束之內(nèi)生成的,特別是在區(qū)間 [start, end] 中。隨機(jī)值取自均勻分布。
下面的示例生成0到10之間的10個隨機(jī)整數(shù)值。
運(yùn)行示例生成并打印10個隨機(jī)整數(shù)值。
隨機(jī)高斯值
可以使用gauss()函數(shù)從高斯分布中提取隨機(jī)浮點(diǎn)值。
該函數(shù)采用兩個參數(shù),分別對應(yīng)于控制分布大小的參數(shù),特別是均值和標(biāo)準(zhǔn)差。
下面的示例從均值為0.0且標(biāo)準(zhǔn)差為1.0的高斯分布中生成10個隨機(jī)值。
請注意,這些參數(shù)不是值的界限,值的分布將由分布的鐘形控制,在這種情況下,按比例可能高于和低于0.0。
運(yùn)行示例生成并打印10個高斯隨機(jī)值。
從列表中隨機(jī)選擇
隨機(jī)數(shù)可用于從列表中隨機(jī)選擇一個項目。
例如,如果一個列表有10個索引在0到9之間的項目,那么你可以生成一個0到9之間的隨機(jī)整數(shù),并使用它從列表中隨機(jī)選擇一個項目。該choice()函數(shù)實現(xiàn)這種行為。以統(tǒng)一的可能性進(jìn)行選擇。
下面的示例生成一個包含20個整數(shù)的列表,并給出了從列表中隨機(jī)選擇一項的五個示例。
運(yùn)行該示例首先打印整數(shù)值列表,然后是從列表中選擇和打印隨機(jī)值的五個示例。
列表中的隨機(jī)子樣本
我們可能對重復(fù)從列表中隨機(jī)選擇項目以創(chuàng)建隨機(jī)選擇的子集感興趣。
重要的是,一旦從列表中選擇了一個項目并將其添加到子集中,就不應(yīng)再次添加。這稱為無替換選擇,因為一旦從列表中為子集選擇了一個項目,它就不會被添加回原始列表(即不能用于重新選擇)。
此行為在sample()函數(shù)中提供,該函數(shù)從列表中隨機(jī)選擇一個樣本而無需替換。該函數(shù)將列表和子集的大小作為參數(shù)進(jìn)行選擇。請注意,項目實際上并未從原始列表中刪除,只是選擇到列表的副本中。
下面的示例演示從20個整數(shù)列表中選擇五個項目的子集。
運(yùn)行該示例首先打印整數(shù)值列表,然后選擇并打印隨機(jī)樣本進(jìn)行比較。
隨機(jī)打亂列表
隨機(jī)性可用于洗牌項目列表,例如shuffling。
該shuffle()函數(shù)可用于洗牌的列表。shuffle就地執(zhí)行,這意味著作為參數(shù)提供給shuffle()函數(shù)的列表被打亂,而不是被創(chuàng)建和返回的列表的打亂副本。
下面的示例演示了隨機(jī)打亂整數(shù)值列表。
運(yùn)行該示例首先打印整數(shù)列表,然后在隨機(jī)打亂后打印相同的列表。
3. NumPy的隨機(jī)數(shù)
在機(jī)器學(xué)習(xí)中,你可能會使用scikit-learn和Keras等庫。
這些庫在幕后使用了NumPy,該庫可以非常高效地處理數(shù)字的向量和矩陣。
NumPy也有自己的偽隨機(jī)數(shù)生成器和便利包裝函數(shù)的實現(xiàn)。
NumPy還實現(xiàn)了Mersenne Twister偽隨機(jī)數(shù)生成器。
讓我們看幾個生成隨機(jī)數(shù)和將隨機(jī)性與NumPy數(shù)組結(jié)合使用的示例。
種子隨機(jī)數(shù)生成器
NumPy偽隨機(jī)數(shù)生成器不同于Python標(biāo)準(zhǔn)庫偽隨機(jī)數(shù)生成器。
重要的是,在Python偽隨機(jī)數(shù)生成器中添加種子不會影響NumPy偽隨機(jī)數(shù)生成器。它必須單獨(dú)播種和使用。
seed()函數(shù)可以被用于接種的NumPy的偽隨機(jī)數(shù)發(fā)生器,將整數(shù)作為seed值。
下面的示例演示了如何為生成器設(shè)置seed以及為生成器重新設(shè)置seed將如何導(dǎo)致生成相同的隨機(jī)數(shù)序列。
運(yùn)行示例為偽隨機(jī)數(shù)生成器提供種子,打印隨機(jī)數(shù)序列,然后為生成器重新設(shè)置種子,顯示生成的隨機(jī)數(shù)序列完全相同。
隨機(jī)浮點(diǎn)值數(shù)組
可以使用rand()NumPy函數(shù)生成隨機(jī)浮點(diǎn)值數(shù)組。
如果未提供參數(shù),則創(chuàng)建單個隨機(jī)值,否則可以指定數(shù)組的大小。
下面的示例創(chuàng)建了一個從均勻分布中提取的10個隨機(jī)浮點(diǎn)值的數(shù)組。
運(yùn)行該示例會生成并打印隨機(jī)浮點(diǎn)值的NumPy數(shù)組。
隨機(jī)整數(shù)值數(shù)組
可以使用randint()?NumPy函數(shù)生成隨機(jī)整數(shù)數(shù)組。
此函數(shù)接受三個參數(shù),范圍的下限、范圍的上限以及要生成的整數(shù)值的數(shù)量或數(shù)組的大小。隨機(jī)整數(shù)將從包括較低值和不包括較高值的均勻分布中抽取,例如在區(qū)間 [lower, upper) 中。
下面的示例演示了生成隨機(jī)整數(shù)數(shù)組。
運(yùn)行該示例會生成并打印一個由0到10之間的20個隨機(jī)整數(shù)值組成的數(shù)組。
隨機(jī)高斯值數(shù)組
可以使用randn()NumPy函數(shù)生成隨機(jī)高斯值數(shù)組。
此函數(shù)采用單個參數(shù)來指定結(jié)果數(shù)組的大小。高斯值取自標(biāo)準(zhǔn)高斯分布;這是一個均值為 0.0 且標(biāo)準(zhǔn)差為 1.0 的分布。
下面的示例顯示了如何生成隨機(jī)高斯值數(shù)組。
運(yùn)行示例生成并打印來自標(biāo)準(zhǔn)高斯分布的 10 個隨機(jī)值數(shù)組。
來自標(biāo)準(zhǔn)高斯分布的值可以通過將值乘以標(biāo)準(zhǔn)偏差并添加來自所需縮放分布的平均值來縮放。例如:
其中mean and stdev是用于期望縮放高斯分布的均值和標(biāo)準(zhǔn)差和值是從一個標(biāo)準(zhǔn)高斯分布的隨機(jī)生成值。
隨機(jī)排列NumPy數(shù)組
NumPy數(shù)組可以使用shuffle()?NumPy函數(shù)就地隨機(jī)打亂。
下面的示例演示了如何打亂NumPy數(shù)組。
運(yùn)行該示例首先生成一個包含20個整數(shù)值的列表,然后打亂并打印打亂后的數(shù)組。
如有部分翻譯問題請多擔(dān)待咩哈哈哈哈!
原文鏈接:
https://machinelearningmastery.com/how-to-generate-random-numbers-in-python/
本篇文章又很多交叉的知識,有問題可以去差一些資料學(xué)習(xí)除本篇文章講解之外的知識點(diǎn)。如果你有什么問題就在公眾號后臺給學(xué)姐留言吧!
