numpy.random.Generator.normal#

方法

random.Generator.normal(loc=0.0, scale=1.0, size=None)#

從常態(高斯)分佈中抽取隨機樣本。

常態分佈的機率密度函數最早由棣莫弗推導出來,200 年後高斯和拉普拉斯也各自獨立推導出來 [2],由於其特徵形狀(請參見以下範例),通常被稱為鐘形曲線。

常態分佈在自然界中經常出現。例如,它描述了受大量微小、隨機擾動影響的樣本的常見分佈,每個擾動都有其獨特的分佈 [2]

參數:
locfloat 或 floats 的類陣列 (array_like)

分佈的平均值(“中心”)。

scalefloat 或 floats 的類陣列 (array_like)

分佈的標準差(離散程度或“寬度”)。必須是非負數。

sizeint 或 ints 的 tuple,選填

輸出形狀。如果給定的形狀是,例如 (m, n, k),則會抽取 m * n * k 個樣本。如果 size 是 None(預設值),且 locscale 都是純量,則會傳回單一值。否則,會抽取 np.broadcast(loc, scale).size 個樣本。

回傳值:
outndarray 或 純量

從參數化的常態分佈中抽取的樣本。

另請參閱

scipy.stats.norm

機率密度函數、分佈或累積密度函數等。

註解

高斯分佈的機率密度為

\[p(x) = \frac{1}{\sqrt{ 2 \pi \sigma^2 }} e^{ - \frac{ (x - \mu)^2 } {2 \sigma^2} },\]

其中 \(\mu\) 是平均值,\(\sigma\) 是標準差。標準差的平方 \(\sigma^2\) 稱為變異數。

該函數在平均值處達到峰值,其“離散程度”隨著標準差的增加而增加(函數在 \(x + \sigma\)\(x - \sigma\) 處達到其最大值的 0.607 倍 [2])。這表示 normal 更可能傳回接近平均值的樣本,而不是遠離平均值的樣本。

參考文獻

[1]

維基百科,“常態分佈”,https://en.wikipedia.org/wiki/Normal_distribution

[2] (1,2,3)

P. R. Peebles Jr.,“中央極限定理”,收錄於“機率、隨機變數與隨機訊號原理”,第 4 版,2001 年,第 51、51、125 頁。

範例

從分佈中抽取樣本

>>> mu, sigma = 0, 0.1 # mean and standard deviation
>>> rng = np.random.default_rng()
>>> s = rng.normal(mu, sigma, 1000)

驗證平均值和標準差

>>> abs(mu - np.mean(s))
0.0  # may vary
>>> abs(sigma - np.std(s, ddof=1))
0.0  # may vary

顯示樣本的直方圖,以及機率密度函數

>>> import matplotlib.pyplot as plt
>>> count, bins, _ = plt.hist(s, 30, density=True)
>>> plt.plot(bins, 1/(sigma * np.sqrt(2 * np.pi)) *
...                np.exp( - (bins - mu)**2 / (2 * sigma**2) ),
...          linewidth=2, color='r')
>>> plt.show()
../../../_images/numpy-random-Generator-normal-1_00_00.png

來自常態分佈的 2x4 樣本陣列,平均值為 3,標準差為 2.5

>>> rng = np.random.default_rng()
>>> rng.normal(3, 2.5, size=(2, 4))
array([[-4.49401501,  4.00950034, -1.81814867,  7.29718677],   # random
       [ 0.39924804,  4.68456316,  4.99394529,  4.84057254]])  # random