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 暗示的預設值。請注意,即使同時指定了 fweightsaweightsddof=1 仍會傳回無偏估計,而 ddof=0 則會傳回簡單平均值。詳細資訊請參閱註解。預設值為 None

fweightsarray_like,int,選用

整數頻率權重的一維陣列;每個觀察值向量應重複的次數。

aweightsarray_like,選用

觀察值向量權重的一維陣列。這些相對權重對於被認為「重要」的觀察值通常較大,而對於被認為較不「重要」的觀察值則較小。如果 ddof=0,則權重陣列可用於為觀察值向量指派機率。

dtypedata-type,選用

結果的資料類型。依預設,傳回的資料類型將至少具有 numpy.float64 精確度。

版本 1.20 新增功能。

回傳:
outndarray

變數的共變異數矩陣。

另請參閱

corrcoef

正規化共變異數矩陣

註解

假設觀察值位於觀察值陣列 m 的欄中,並為簡潔起見,令 f = fweightsa = 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\) 之間的相關性,為負值。

此外,請注意 xy 如何組合

>>> 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)