jax.numpy.cov#

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

估计加权样本协方差。

JAX 中对 numpy.cov() 的实现。

变量 i 和变量 j 之间的协方差 \(C_{ij}\) 定义为

\[cov[X_i, X_j] = E[(X_i - E[X_i])(X_j - E[X_j])]\]

给定变量 \(X_i\)\(X_j\)N 个观测值的数组,可以通过样本协方差进行估计:

\[C_{ij} = \frac{1}{N - 1} \sum_{n=1}^N (X_{in} - \overline{X_i})(X_{jn} - \overline{X_j})\]

其中 \(\overline{X_i} = \frac{1}{N} \sum_{k=1}^N X_{ik}\) 是观测值的平均值。

参数:
  • m (ArrayLike) – 形状为 (M, N)(如果 rowvar 为 True)或 (N, M)(如果 rowvar 为 False)的数组,表示 M 个变量的 N 个观测值。m 也可以是一维的,表示一个单变量的 N 个观测值。

  • y (ArrayLike | None) – 可选的额外观测值集合,与 m 形状相同。如果指定,则 y 将与 m 组合,即对于默认的 rowvar = True 情况,m 将变为 jnp.vstack([m, y])

  • rowvar (bool) – 如果为 True(默认),则 m 的每一行代表一个变量。如果为 False,则每一列代表一个变量。

  • bias (bool) – 如果为 False(默认),则通过 N - 1 来归一化协方差。如果为 True,则通过 N 来归一化协方差。

  • ddof (int | None) – 指定自由度。如果 bias 为 False,则默认为 1;如果 bias 为 True,则默认为 0

  • fweights (ArrayLike | None) – 可选的整数频率权重数组,形状为 (N,)。这是一个绝对权重,指定每个观测值在计算中包含的次数。

  • aweights (ArrayLike | None) – 可选的观测值权重数组,形状为 (N,)。这是一个相对权重,指定每个观测值的“重要性”。在 ddof=0 情况下,相当于为每个观测值分配概率。

返回:

一个形状为 (M, M) 的协方差矩阵,如果 M = 1 则为一个形状为 () 的标量。

返回类型:

数组

另请参阅

示例

考虑这两个变量的观测值,它们完美相关。在这种情况下,协方差矩阵是一个由全1组成的2x2矩阵。

>>> x = jnp.array([[0, 1, 2],
...                [0, 1, 2]])
>>> jnp.cov(x)
Array([[1., 1.],
       [1., 1.]], dtype=float32)

现在考虑这两个变量的观测值,它们完全反相关。在这种情况下,协方差矩阵的非对角线元素为 -1

>>> x = jnp.array([[-1,  0,  1],
...                [ 1,  0, -1]])
>>> jnp.cov(x)
Array([[ 1., -1.],
       [-1.,  1.]], dtype=float32)

同样地,这些序列可以作为单独的参数指定,在这种情况下,它们在继续计算之前会被堆叠起来。

>>> x = jnp.array([-1, 0, 1])
>>> y = jnp.array([1, 0, -1])
>>> jnp.cov(x, y)
Array([[ 1., -1.],
       [-1.,  1.]], dtype=float32)

通常,协方差矩阵的元素可以是任何正或负实值。例如,这是从三维标准正态分布中抽取的 100 个点的协方差。

>>> key = jax.random.key(0)
>>> x = jax.random.normal(key, shape=(3, 100))
>>> with jnp.printoptions(precision=2):
...   print(jnp.cov(x))
[[0.9  0.03 0.1 ]
 [0.03 1.   0.01]
 [0.1  0.01 0.85]]