numpy.cov#

numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None, *, dtype=None)[源代码]#

给定数据和权重,估计协方差矩阵.

协方差表示两个变量一起变化的程度.如果我们检查 N 维样本, \(X = [x_1, x_2, ... x_N]^T\) ,则协方差矩阵元素 \(C_{ij}\)\(x_i\)\(x_j\) 的协方差.元素 \(C_{ii}\)\(x_i\) 的方差.

有关算法的概述,请参见注释.

参数:
marray_like

包含多个变量和观测值的 1-D 或 2-D 数组. m 的每一行代表一个变量,每一列代表所有这些变量的单个观测值.另请参阅下面的 rowvar .

y类数组,可选

另一组变量和观测值. y 的形式与 m 相同.

rowvarbool,可选

如果 rowvar 为 True(默认),则每一行代表一个变量,观测值位于列中. 否则,关系被转置:每列代表一个变量,而行包含观测值.

biasbool,可选

默认标准化 (False) 使用 (N - 1) ,其中 N 是给定的观测值数量(无偏估计).如果 bias 为 True,则标准化使用 N . 这些值可以通过在 numpy 版本 >= 1.5 中使用关键字 ddof 来覆盖.

ddofint, optional

如果不是 None ,则覆盖 bias 隐含的默认值. 请注意,即使同时指定了 fweightsaweights , ddof=1 也会返回无偏估计,而 ddof=0 会返回简单平均值. 有关详细信息,请参见注释. 默认值为 None .

fweights类数组, int, 可选

整数频率权重的 1-D 数组;每个观测向量应重复的次数.

aweights类数组,可选

观测向量权重的 1-D 数组.对于被认为"重要"的观测值,这些相对权重通常很大,而对于被认为不太"重要"的观测值,这些相对权重通常较小.如果 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 / (v12 - 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)