You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何numpy.cov(a,a)的结果并非所有象限都是自协方差?

Numpy.cov传入相同多变量数组时的结果疑问解答

问题描述

我有一个形状为(100, 256)的数据集(100次模拟,每次包含256个值),为测试numpy.cov的工作机制,我传入两个完全相同的数组np.cov(a,a)。我原本预期得到的协方差矩阵结构是:

[cov(a,a) cov(a,a)]
[cov(a,a) cov(a,a)]

但实际结果和预期不符。

测试代码

Pow_i = Pk_dd_pow
Pow_j = Pk_dd_pow
numpy_cov= np.cov(np.array(np.real(Pk_pow_i)).T, np.array(np.real(Pk_pow_j)).T)

得到的numpy_cov是(512,512)数组,符合预期。随后执行以下代码验证矩阵象限:

left_upper = numpy_cov[0:256,0:256]
right_upper=  numpy_cov[256:513,0:256]
right_lower = numpy_cov[256:513,256:513]
left_lower = numpy_cov[0:256,256:513]
print(np.array_equal(right_lower, left_upper))
print(np.array_equal(left_lower, right_upper))
print(np.array_equal(right_lower, right_upper))
print(np.array_equal(left_lower, left_upper))
print(np.array_equal(left_lower, right_lower))

输出结果

True
True
False
False
False

疑问:为何四个象限不都是自协方差矩阵?

原因分析

问题出在np.cov的输入维度处理逻辑上:

  • 当你传入np.cov(X, Y)时,numpy会把X和Y当成多变量集合,而非单个变量。你的代码里,X和Y都是转置后的(256, 100)数组——这意味着X包含256个独立变量,每个变量有100个样本;Y和X完全相同,所以也是256个变量。
  • np.cov(X, Y)计算的是所有变量两两之间的协方差:前256行/列对应X的变量,后256行/列对应Y的变量:
    • 左上left_upper是X内部变量的自协方差矩阵(也就是cov(X,X))
    • 右下right_lower是Y内部变量的自协方差矩阵(cov(Y,Y)),因为X=Y,所以它和左上完全相等
    • 右上right_upper是Y的每个变量和X的每个变量的协方差矩阵(cov(Y,X))
    • 左下left_lower是X的每个变量和Y的每个变量的协方差矩阵(cov(X,Y)),由于协方差矩阵的对称性,cov(X,Y)和cov(Y,X)是相等的,所以左下和右上一致

你预想的四个象限全相等的情况,只有当X和Y是**一维数组(单个变量)**时才会出现。但在你的场景里,X和Y是多变量集合,cov(X,Y)里的每个元素是X的某一个变量和Y的某一个变量的协方差,只有当两个变量是同一个位置(比如X的第i个变量和Y的第i个变量)时,这个值才等于该变量的自协方差,整个矩阵和cov(X,X)并不相等。

举个简单的对比例子验证:

import numpy as np
# 单个变量场景:X和Y都是一维数组
X = np.random.randn(100)
Y = X.copy()
cov_mat = np.cov(X, Y)
print(cov_mat)
# 输出会是[[cov(X,X), cov(X,Y)], [cov(Y,X), cov(Y,Y)]],四个元素完全相等

内容的提问来源于stack exchange,提问作者user20742923

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:46:26