numpy.cov#
- numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None, *, dtype=None)[source]#
給定資料與權重,估計共變異數矩陣。
共變異數表示兩個變數一起變化的程度。如果我們檢查 N 維樣本 \(X = [x_1, x_2, ... x_N]^T\),則共變異數矩陣元素 \(C_{ij}\) 是 \(x_i\) 和 \(x_j\) 的共變異數。元素 \(C_{ii}\) 是 \(x_i\) 的變異數。
演算法概要請參閱註解。
- 參數:
- marray_like
包含多個變數和觀察值的一維或二維陣列。 m 的每一列代表一個變數,每一欄代表所有這些變數的單一觀察值。另請參閱下方的 rowvar。
- yarray_like,選用
額外的一組變數和觀察值。y 的形式與 m 相同。
- rowvarbool,選用
如果 rowvar 為 True (預設值),則每一列代表一個變數,觀察值位於欄中。否則,關係會轉置:每一欄代表一個變數,而列包含觀察值。
- biasbool,選用
預設正規化 (False) 是除以
(N - 1)
,其中N
是給定的觀察值數量 (無偏估計)。如果 bias 為 True,則正規化是除以N
。這些值可以使用 numpy 版本 >= 1.5 中的關鍵字ddof
覆寫。- ddofint,選用
如果不是
None
,則會覆寫 bias 暗示的預設值。請注意,即使同時指定了 fweights 和 aweights,ddof=1
仍會傳回無偏估計,而ddof=0
則會傳回簡單平均值。詳細資訊請參閱註解。預設值為None
。- fweightsarray_like,int,選用
整數頻率權重的一維陣列;每個觀察值向量應重複的次數。
- aweightsarray_like,選用
觀察值向量權重的一維陣列。這些相對權重對於被認為「重要」的觀察值通常較大,而對於被認為較不「重要」的觀察值則較小。如果
ddof=0
,則權重陣列可用於為觀察值向量指派機率。- dtypedata-type,選用
結果的資料類型。依預設,傳回的資料類型將至少具有
numpy.float64
精確度。版本 1.20 新增功能。
- 回傳:
- outndarray
變數的共變異數矩陣。
另請參閱
corrcoef
正規化共變異數矩陣
註解
假設觀察值位於觀察值陣列 m 的欄中,並為簡潔起見,令
f = fweights
和a = aweights
。計算加權共變異數的步驟如下>>> m = np.arange(10, dtype=np.float64) >>> f = np.arange(10) * 2 >>> a = np.arange(10) ** 2. >>> ddof = 1 >>> w = f * a >>> v1 = np.sum(w) >>> v2 = np.sum(w * a) >>> m -= np.sum(m * w, axis=None, keepdims=True) / v1 >>> cov = np.dot(m * w, m.T) * v1 / (v1**2 - ddof * v2)
請注意,當
a == 1
時,正規化因子v1 / (v1**2 - ddof * v2)
會變成1 / (np.sum(f) - ddof)
,這應為如此。範例
>>> import numpy as np
考慮兩個變數 \(x_0\) 和 \(x_1\),它們完全相關,但方向相反
>>> x = np.array([[0, 2], [1, 1], [2, 0]]).T >>> x array([[0, 1, 2], [2, 1, 0]])
請注意 \(x_0\) 如何增加,而 \(x_1\) 如何減少。共變異數矩陣清楚地顯示了這一點
>>> np.cov(x) array([[ 1., -1.], [-1., 1.]])
請注意,元素 \(C_{0,1}\) 顯示 \(x_0\) 和 \(x_1\) 之間的相關性,為負值。
此外,請注意 x 和 y 如何組合
>>> x = [-2.1, -1, 4.3] >>> y = [3, 1.1, 0.12] >>> X = np.stack((x, y), axis=0) >>> np.cov(X) array([[11.71 , -4.286 ], # may vary [-4.286 , 2.144133]]) >>> np.cov(x, y) array([[11.71 , -4.286 ], # may vary [-4.286 , 2.144133]]) >>> np.cov(x) array(11.71)