numpy.random.normal#

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

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

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

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

注意

新程式碼應使用 normal 方法,此方法屬於 Generator 實例;請參閱快速入門

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

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

scalefloat 或 float 的類陣列 (array_like)

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

sizeint 或 int 的 tuple,可選

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

返回:
outndarray 或 純量

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

參見

scipy.stats.norm

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

random.Generator.normal

新程式碼應使用的方法。

註解

高斯分佈的機率密度為

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

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

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

參考文獻

[1]

Wikipedia, “常態分佈”, https://en.wikipedia.org/wiki/Normal_distribution

[2] (1,2,3)

P. R. Peebles Jr., “中央極限定理” in “Probability, Random Variables and Random Signal Principles”, 4th ed., 2001, pp. 51, 51, 125.

範例

從分佈中抽取樣本

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

驗證平均值和標準差

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

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

>>> import matplotlib.pyplot as plt
>>> count, bins, ignored = 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-normal-1_00_00.png

從平均值為 3,標準差為 2.5 的常態分佈中抽取的 2x4 陣列樣本

>>> np.random.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