如何使用NumPy生成正態(tài)分布隨機(jī)數(shù)
概率分布描述了事件或?qū)嶒?yàn)所有可能結(jié)果的可能性。正態(tài)分布是最有用的概率分布之一,因?yàn)樗梢院芎玫啬M許多自然現(xiàn)象。
正態(tài)分布在其峰值周圍是對(duì)稱的。由于這種對(duì)稱性,分布的均值通常用μ表示,并位于該峰值處。標(biāo)準(zhǔn)差σ描述了分布的擴(kuò)散程度。
如果一些樣本服從正態(tài)分布,則隨機(jī)抽取一個(gè)樣本接近均值的概率很高。實(shí)際上,大約68%的所有樣本都在距離平均值一個(gè)標(biāo)準(zhǔn)差之內(nèi)。
圖中曲線下的面積解釋為概率測量。綠色區(qū)域代表所有小于平均數(shù)一個(gè)標(biāo)準(zhǔn)偏差的樣本,占曲線下面積的68%。
我們都知道在Matlab中可以使用randn函數(shù)創(chuàng)建正態(tài)分布的隨機(jī)數(shù)。
在Python中,可以使用NumPy從正態(tài)分布中創(chuàng)建隨機(jī)數(shù)樣本。
numpy生成隨機(jī)數(shù)
NumPy包含一個(gè)完整的子包numpy.random,專門用于處理隨機(jī)數(shù)。由于歷史原因,該軟件包包括許多函數(shù)。
通常應(yīng)該通過實(shí)例化默認(rèn)隨機(jī)數(shù)生成器(RNG)來開始:
import numpy as np
rng = np.random.default_rng()
RNG可以從許多不同的分布中生成隨機(jī)數(shù)。
要從正態(tài)分布中抽樣,可以使用.normal()函數(shù):
雖然上圖這些數(shù)字看起來是隨機(jī)的,但很難確認(rèn)這些數(shù)字是否從給定分布中抽取的。
因此,可以一次生成大量隨機(jī)數(shù):
numbers = rng.normal(size=10000)
numbers.mean()
numbers.std()
若沒有指定任何其他參數(shù),則NumPy將創(chuàng)建所謂的標(biāo)準(zhǔn)正態(tài)分布數(shù)字,其以μ = 0為中心,并具有標(biāo)準(zhǔn)偏差σ=1。
可以使用mean檢查平均值是否大約為零,使用.std()來檢查標(biāo)準(zhǔn)偏差是否接近于1。
可以使用size指定隨機(jī)數(shù)組的維度
繪制正態(tài)分布圖像
這里嘗試生成直方圖表示上一節(jié)生成的10000個(gè)隨機(jī)數(shù)
import matplotlib.pyplot as plt
plt.hist(numbers)
plt.show
直方圖的縱軸表示不同區(qū)間的樣本數(shù)量。
直方圖的形狀顯示了與正態(tài)分布相關(guān)聯(lián)的特征,它是對(duì)稱的,具有一個(gè)明確定義的峰值,并向兩側(cè)逐漸變窄。
通過增加區(qū)間數(shù)量,可以得到更加平滑的圖像
plt.hist(numbers,bins=500)
plt.show
這些是概率密度函數(shù),可以使用它們來繪制理論概率分布,并與之前生成的隨機(jī)數(shù)分布進(jìn)行對(duì)比,可以看到生成的隨機(jī)數(shù)符合正態(tài)分布
import scipy.stats
bins = 500
bin_width = (numbers.max() - numbers.min()) / bins
hist_area = len(numbers) * bin_width
x = np.linspace(numbers.min(), numbers.max(), 101)
plt.plot(x, scipy.stats.norm.pdf(x) * hist_area)
plt.hist(numbers,bins=500)
plt.show()
控制隨機(jī)數(shù)生成器
自然界很多事物都服從正態(tài)分布,例如身高、體重、鞋碼。
在像計(jì)算機(jī)這樣的確定性系統(tǒng)中創(chuàng)建隨機(jī)數(shù)并不容易。大多數(shù)隨機(jī)數(shù)生成器不能產(chǎn)生真正的隨機(jī)性,而是通過一種確定性和可重復(fù)的過程生成數(shù)字,使得這些數(shù)字看起來是隨機(jī)的。
通常情況下,一個(gè)隨機(jī)數(shù)生成器——或者更準(zhǔn)確地說,偽隨機(jī)數(shù)生成器(PRNG)——是從已知種子開始,并從中生成一個(gè)偽隨機(jī)數(shù)。這樣一個(gè)發(fā)生器的優(yōu)點(diǎn)之一就在于可以再現(xiàn)那些偽造出來的數(shù)字:
如果使用特定的種子創(chuàng)建隨機(jī)數(shù)生成器,則可以通過使用相同的種子稍后重新創(chuàng)建相同的隨機(jī)數(shù)。在此示例中,對(duì).normal()的第二次調(diào)用生成與第一次調(diào)用相同的數(shù)字。另一方面,如果您使用不同的種子初始化生成器,則會(huì)獲得不同的隨機(jī)數(shù)。
歷史上,在NumPy中處理隨機(jī)數(shù)時(shí)沒有使用顯式隨機(jī)數(shù)生成器。而是直接調(diào)用諸如np.random.normal()之類的函數(shù)。但是,NumPy 1.17引入了顯式隨機(jī)數(shù)生成器,并鼓勵(lì)盡可能多地使用這種新方法來處理隨機(jī)數(shù)。
用中心極限定理逐步接近正常分布
正態(tài)分布在統(tǒng)計(jì)學(xué)和概率論中扮演著重要角色。它出現(xiàn)在許多實(shí)際例子和許多理論結(jié)果中。中心極限定理可以解釋一些根本原因。
該結(jié)果表明,重復(fù)實(shí)驗(yàn)的平均值將近似于正態(tài)分布。這個(gè)成立的一個(gè)重要條件是實(shí)驗(yàn)具有相同的分布,盡管它們不需要是正態(tài)分布。
舉個(gè)擲骰子的例子。普通骰子有六個(gè)面,在單次擲骰子時(shí),每種結(jié)果——1、2、3、4、5或6都是等可能發(fā)生的。因此這些投擲是均勻分布的,然而,反復(fù)投擲骰子得到的平均數(shù)仍會(huì)接近正態(tài)分布。
可以使用NumPy來證明這一點(diǎn)。首先生成隨機(jī)骰子投擲:
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(seed=2310)
rng.integers(low=1, high=6, endpoint=True, size=1)
使用 .integers() 并指定要在 1 到 6 的范圍內(nèi)(包括邊界)抽樣整數(shù)。接下來可以使用 size 來模擬重復(fù)擲骰子的分布。首先將擲骰子的次數(shù)重復(fù)兩次,為了獲得代表性分布,進(jìn)行10000次這樣的重復(fù)投擲,使用 .mean() 來計(jì)算兩次擲骰子的平均值,然后繪制直方圖來查看分布:
rolls = rng.integers(low=1, high=6, endpoint=True, size=(10_000, 2))
plt.hist(rolls.mean(axis=1), bins=21)
plt.show()
分布接近對(duì)稱且有明顯的峰值,該分布并不均勻,每個(gè)結(jié)果出現(xiàn)的可能性也不相等。
如果你增加重復(fù)的次數(shù),那么你會(huì)發(fā)現(xiàn)分布會(huì)越來越接近正態(tài)分布。
這說明了中心極限定理:重復(fù)實(shí)驗(yàn)產(chǎn)生正態(tài)性。因?yàn)樵S多自然過程包括累加效應(yīng),它們通常會(huì)符合正態(tài)分布。
—— end ——
文章來源:基算仿真
工程師必備
- 項(xiàng)目客服
- 培訓(xùn)客服
- 平臺(tái)客服
TOP




















