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\) 的變異數(即其「散佈」)。
除了指定完整的共變異數矩陣外,常用的近似值包括
這種幾何特性可以在二維繪製的資料點中看到
>>> 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()