numpy.random.RandomState.multivariate_normal#
方法
- random.RandomState.multivariate_normal(mean, cov, size=None, check_valid='warn', tol=1e-8)#
從多變量常態分佈中抽取隨機樣本。
多變量常態分佈、多常態分佈或高斯分佈是一維常態分佈推廣到更高維度的形式。此類分佈由其平均值和共變異數矩陣指定。這些參數類似於一維常態分佈的平均值(平均或「中心」)和變異數(標準差,或「寬度」的平方)。
注意
新程式碼應使用
Generator
實例的multivariate_normal
方法;請參閱快速入門。- 參數:
- mean一維 array_like,長度為 N
N 維分佈的平均值。
- cov二維 array_like,形狀為 (N, N)
分佈的共變異數矩陣。為了正確採樣,它必須是對稱且正半定的。
- size整數或整數元組,選用
給定一個形狀,例如
(m,n,k)
,會生成m*n*k
個樣本,並封裝在 m 乘 n 乘 k 的排列中。由於每個樣本都是 N 維的,因此輸出形狀為(m,n,k,N)
。如果未指定形狀,則傳回單個 (N 維) 樣本。- check_valid{ ‘warn’, ‘raise’, ‘ignore’ }, 選用
當共變異數矩陣不是正半定時的行為。
- tol浮點數,選用
檢查共變異數矩陣中的奇異值時的容差。cov 在檢查前會轉換為雙精度浮點數。
- 傳回值:
- outndarray
繪製的樣本,如果提供了 *size*,則形狀為 *size*。否則,形狀為
(N,)
。換句話說,每個條目
out[i,j,...,:]
都是從分佈中抽取的 N 維值。
另請參閱
random.Generator.multivariate_normal
新程式碼應使用此方法。
註解
平均值是 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 >>> x, y = np.random.multivariate_normal(mean, cov, 5000).T >>> plt.plot(x, y, 'x') >>> plt.axis('equal') >>> plt.show()
請注意,共變異數矩陣必須是正半定(也稱為非負定)。否則,此方法的行為是未定義的,且不保證向後相容性。
參考文獻
[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]] >>> x = np.random.multivariate_normal(mean, cov, (3, 3)) >>> x.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 = np.random.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()