Python Numpy Conv 混乱

Python Numpy Conv confussion

我正在尝试计算两个向量 ab 的协方差矩阵,我正在为其使用 numpys cov 实现 R = np.cov(a,b)。当我注意到 np.cov(a,b)[0,0] != np.var(a) 时,我有点困惑,但是我发现,这与有偏见和无偏见有关估算器并由 ddof 控制。

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

R[0,1] = R[1,0] = std(a) * std(b)
R[0,1] = R[1,0] = var(a)**0.5 * var(b)**0.5
R[0,1] = R[1,0] = R[0,0]**0.5 * R[1,1]**0.5

我哪里弄错了?

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 的来源,但这不是我见过的 cross-covariance 的公式。我将其视为 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 arg 传递给 cov()

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

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

得到的结果