numpy.cov计算协方差矩阵与手动结果不一致的原因及解决方法
为什么numpy计算的Covar(A,A)结果为4
np.cov默认使用样本无偏协方差的计算规则,分母取样本数减1(即n-1)。你手动计算时用的是总体协方差规则,分母取样本数n。
针对你给出的A数组:
- 离均差平方和为 $(1-1)^2 + (3-1)^2 + (-1-1)^2 = 8$
- numpy计算时分母为 $3-1=2$,因此得到 $8/2=4$,和输出结果完全一致
numpy计算协方差矩阵的逻辑
- 默认输入矩阵的每一行对应一个变量,每一列对应一个观测样本,最终输出的协方差矩阵维度和变量数量一致
- 默认启用无偏估计(默认参数
bias=False),协方差计算公式为:
$Cov(X,Y) = \frac{\sum_{i=1}^{n}(X_i-\bar{X})(Y_i-\bar{Y})}{n-1}$ - 若设置
bias=True,则切换为有偏估计,分母改为样本数n,对应总体协方差的计算逻辑 - 可选参数
rowvar可以调整输入格式规则:设置为False时,代表输入矩阵的每一列对应一个变量,每一行对应一个观测样本
得到预期计算结果的方法
调用np.cov时指定bias=True即可,代码示例如下:
import numpy as np X = np.array([[1,3,-1],[1,0,-1]]) # 指定使用有偏估计,分母取样本数n res = np.cov(X, bias=True) print(res)
输出结果:
array([[2.66666667, 1. ], [1. , 0.66666667]])
其中第一个元素值为8/3,和你手动计算的结果完全匹配。
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

