Python Numpy Conv confussion



我试图计算两个向量的协方差矩阵ab为此,我使用numpys cov实现R = np.cov(a,b)。当我注意到np.cov(a,b)[0,0] != np.var(a)时,我有点困惑,但是我能够找到它,这与有偏估计和无偏估计有关,并且由dof控制。

然而,这并不是结束。为什么R[0,1] = R[0,0]**0.5 * R[1,1]**0.5 ?根据我的理解和维基百科上的协方差矩阵的定义https://en.wikipedia.org/wiki/Covariance_matrix

[0,1] = R(1,0) =性病(a) *性病(b)
[0,1] = R (1,0) = var (a) * 0.5 * 0.5 * var (b) * *
[0,1] = R (1,0) = R (0,0) * * 0.5 * 0.5 R (1, - 1) * *

我错在哪里?

import numpy as np
rng = np.random.default_rng(seed=43)
a = rng.random((1,3))
b = rng.random((1,3))
R = np.cov(a,b,ddof=1)
print(R)
print('var a: '   + str(np.var(a,ddof=1)))
print('var b: '   + str(np.var(b,ddof=1)))
print('cov a,b: ' + str(np.var(a,ddof=1)**0.5*np.var(b,ddof=1)**0.5))
print('cov a,b: ' + str(R[0,0]**0.5*R[1,1]**0.5))
print('cov a,b: ' + str(np.std(a,ddof=1)*np.std(b,ddof=1)))
我提前为任何拼写或堆栈溢出的种族错误道歉。如有任何帮助,不胜感激。

我不确定公式var(a)**0.5 * var(b)**0.5是从哪里来的,但它不是我见过的交叉协方差公式。我把它看作是x - mean_of_xy - mean_of_y的乘积的期望值。

在循环样式中(为了清晰起见),它可能看起来像:

a_mean = np.mean(a)
b_mean = np.mean(b)
s = 0
n = len(a[0])
for i, _ in enumerate(a[0]):
s += (a[0][i] - a_mean) * (b[0][i] - b_mean)

s / (n-1)
# 0.09175517729176114

在Numpy中你也可以这样做:

a_mean = np.mean(a)
b_mean = np.mean(b)
(a - a_mean) @ (b - b_mean).T / (n-1)
# array([[0.09175518]])

这对应于你在角落里得到的值。

如果要除以n而不是n-2,可以将bias参数传递给cov()

np.cov(a, b, bias=True)
# array([[0.08562558, 0.06117012],
[0.06117012, 0.06361328]])

这里的角是使用上述代码将结果除以3(n)而不是2(n-1)将得到的结果

最新更新