为什么numpy的协方差结果与手动计算略有不同?

5

我很好奇,所以想问一下这个问题。为什么当我手动计算数据集的协方差矩阵时,我的值与numpy的值略有不同?

我有两个数据集XY

data = io.loadmat("datafile.mat")['data']
X = data[:,0]
Y = data[:,1]

协方差矩阵可以通过以下方式计算(查看X和X,X和Y,Y和X等之间的相关性)。
n = len(X)
corXX = np.var(X)
corXY = (1/n)*np.dot(X - np.mean(X), Y - np.mean(Y))
corYY = np.var(Y)
covariance = np.array([[corXX, corXY], [corXY, corYY] ])

对于我的数据集,这给了我:
array([[ 1.722105  ,  5.34104265],
   [ 5.34104265, 17.72717759]])

如果使用numpy的协方差函数 covariance = np.cov(X,Y),则会得到以下结果:

array([[  1.7395    ,   5.39499258],
   [  5.39499258,  17.90623999]]) 

有些相似,但并不完全相同...


2
尝试一下,在np.cov的参数中添加bias=True,然后再次进行比较。 - Ignacio Vergara Kausel
当然可以 - 现在它给出了完全相同的答案。为什么呢? - mchristos
1个回答

7

默认情况下,np.cov 计算的是无偏协方差,使用的因子为 (N-1) 而不是您所计算的 N

如果您查看 np.cov 的文档,您会发现有一个参数(bias)可以选择偏差或无偏版本的协方差。默认情况下,它设置为 false

如果您感兴趣,可以在这里了解有关使用不同预因子的问题背后的问题。


不错!了解背后的统计数据会很有趣。 - mchristos
你可以阅读这篇文章,但归根结底,你只有样本而不是整个人口,这就是为什么需要额外的修正因子。 - Ignacio Vergara Kausel
好的,你刚刚链接了文档,但我并没有看到一篇文章。 - mchristos
糟糕,我把链接搞错了...马上更正,无论如何,您可以并且应该至少参考维基百科 ;) - Ignacio Vergara Kausel
应该是 (N-1) 而不是 (N+1) - pe-perry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接