numpy.random.Generator.multivariate_normal#

方法

random.Generator.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8, *, method='svd')#

從多元常態分佈中抽取隨機樣本。

多元常態分佈、多變數常態分佈或高斯分佈是一維常態分佈在高維度上的推廣。這種分佈由其均值和共變異數矩陣指定。這些參數類似於一維常態分佈的均值(平均值或「中心」)和變異數(標準差的平方,或「寬度」)。

參數:
mean長度為 N 的 1-D 類陣列

N 維分佈的均值。

cov形狀為 (N, N) 的 2-D 類陣列

分佈的共變異數矩陣。為了正確採樣,它必須是對稱且正半定的。

sizeint 或 int 元組,選用

給定一個形狀,例如 (m,n,k),將生成 m*n*k 個樣本,並以 m-乘-n-乘-k 的排列方式打包。由於每個樣本都是 N 維的,因此輸出形狀為 (m,n,k,N)。如果未指定形狀,則返回單個 (N-D) 樣本。

check_valid{ ‘warn’, ‘raise’, ‘ignore’ },選用

當共變異數矩陣不是正半定時的行為。

tolfloat,選用

檢查共變異數矩陣中的奇異值時的容差。cov 在檢查前會被轉換為 double。

method{ ‘svd’, ‘eigh’, ‘cholesky’},選用

cov 輸入用於計算因子矩陣 A,使得 A @ A.T = cov。此參數用於選擇用於計算因子矩陣 A 的方法。預設方法 ‘svd’ 最慢,而 ‘cholesky’ 最快,但不如最慢的方法穩健。eigh 方法使用特徵分解來計算 A,速度比 svd 快,但比 cholesky 慢。

返回:
outndarray

繪製的樣本,如果提供了 size,則形狀為 size。否則,形狀為 (N,)

換句話說,每個條目 out[i,j,...,:] 都是從分佈中抽取的 N 維值。

說明

均值是 N 維空間中的坐標,表示最有可能生成樣本的位置。這類似於一維或單變數常態分佈的鐘形曲線的峰值。

共變異數表示兩個變數一起變化的程度。從多元常態分佈中,我們抽取 N 維樣本,\(X = [x_1, x_2, ... x_N]\)。共變異數矩陣元素 \(C_{ij}\)\(x_i\)\(x_j\) 的共變異數。元素 \(C_{ii}\)\(x_i\) 的變異數(即其「散佈」)。

除了指定完整的共變異數矩陣外,常用的近似值包括

  • 球形共變異數(cov 是單位矩陣的倍數)

  • 對角共變異數(cov 具有非負元素,且僅在對角線上)

這種幾何特性可以在二維繪製的資料點中看到

>>> mean = [0, 0]
>>> cov = [[1, 0], [0, 100]]  # diagonal covariance

對角共變異數表示點沿 x 軸或 y 軸定向

>>> import matplotlib.pyplot as plt
>>> rng = np.random.default_rng()
>>> x, y = rng.multivariate_normal(mean, cov, 5000).T
>>> plt.plot(x, y, 'x')
>>> plt.axis('equal')
>>> plt.show()

請注意,共變異數矩陣必須是正半定(也稱為非負定)。否則,此方法的行為未定義,且不保證向後相容性。

此函數在內部使用線性代數常式,因此,即使精度相同,跨架構、作業系統甚至建置結果也可能不完全相同。例如,如果 cov 具有多個相等的奇異值且 method'svd'(預設值),則很可能發生這種情況。在這種情況下,method='cholesky' 可能更穩健。

參考文獻

[1]

Papoulis, A., “Probability, Random Variables, and Stochastic Processes,” 3rd ed., New York: McGraw-Hill, 1991.

[2]

Duda, R. O., Hart, P. E., and Stork, D. G., “Pattern Classification,” 2nd ed., New York: Wiley, 2001.

範例

>>> mean = (1, 2)
>>> cov = [[1, 0], [0, 1]]
>>> rng = np.random.default_rng()
>>> x = rng.multivariate_normal(mean, cov, (3, 3))
>>> x.shape
(3, 3, 2)

我們可以使用預設方法以外的其他方法來分解 cov

>>> y = rng.multivariate_normal(mean, cov, (3, 3), method='cholesky')
>>> y.shape
(3, 3, 2)

在這裡,我們從二元常態分佈中生成 800 個樣本,其均值為 [0, 0],共變異數矩陣為 [[6, -3], [-3, 3.5]]。樣本的第一個和第二個成分的預期變異數分別為 6 和 3.5,預期相關係數為 -3/sqrt(6*3.5) ≈ -0.65465。

>>> cov = np.array([[6, -3], [-3, 3.5]])
>>> pts = rng.multivariate_normal([0, 0], cov, size=800)

檢查樣本的均值、共變異數和相關係數是否接近預期值

>>> pts.mean(axis=0)
array([ 0.0326911 , -0.01280782])  # may vary
>>> np.cov(pts.T)
array([[ 5.96202397, -2.85602287],
       [-2.85602287,  3.47613949]])  # may vary
>>> np.corrcoef(pts.T)[0, 1]
-0.6273591314603949  # may vary

我們可以使用散佈圖視覺化此資料。點雲的方向說明了此樣本成分的負相關性。

>>> import matplotlib.pyplot as plt
>>> plt.plot(pts[:, 0], pts[:, 1], '.', alpha=0.5)
>>> plt.axis('equal')
>>> plt.grid()
>>> plt.show()
../../../_images/numpy-random-Generator-multivariate_normal-1.png