Python Numpy Conv 混乱
Python Numpy Conv confussion
我正在尝试计算两个向量 a 和 b 的协方差矩阵,我正在为其使用 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_x
和 y - 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)
得到的结果
我正在尝试计算两个向量 a 和 b 的协方差矩阵,我正在为其使用 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_x
和 y - 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)