为何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
相关产品推荐
相关产品推荐

