Numpy 协方差
Numpy Covariance
当对 numpy 矩阵应用零均值时,以下 2 个代码之间是否存在预期差异?我正在学习 andrew ng 的 ML 课程,他建议使用 X @ X^T 来查找协方差矩阵(考虑应用零均值)。当我试图目视检查矩阵时,发现它给出了 np.cov 函数的差异结果。请帮助..
import numpy as np
X=np.random.randint(0,9,(3,3))
print(X)
[[2 1 5]
[7 4 8]
[4 7 6]]
X = (X - X.mean(axis=0)) # <- Zero Mean
print(X)
[[-2.33333333 -3. -1.33333333]
[ 2.66666667 0. 1.66666667]
[-0.33333333 3. -0.33333333]]
cov1 = (X @ X.T)/m # <- Find covariance manually as suggested in the course
print(cov1)
[[ 5.40740741 -2.81481481 -2.59259259]
[-2.81481481 3.2962963 -0.48148148]
[-2.59259259 -0.48148148 3.07407407]]
cov2 = np.cov(X,bias=True) # <- Find covariance with np.cov
print(cov2)
[[ 0.7037037 0.59259259 -1.2962963 ]
[ 0.59259259 1.81481481 -2.40740741]
[-1.2962963 -2.40740741 3.7037037 ]]
如果您的观察值在行中,变量在列中(将 rowvar
设置为 False
),则它必须是 x.T @ x
:
import numpy as np
x0 = np.array([[2, 1, 5], [7, 4, 8], [4, 7, 6]])
x = x0 - x0.mean(axis=0)
cov1 = x.T @ x / 3
cov2 = np.cov(x, rowvar=False, bias=True)
assert np.allclose(cov1, cov2)
x @ x.T
适用于观察值在列中且变量在行中的情况:
x = x0 - x0.mean(axis=1)[:,None]
cov1 = x @ x.T / 3
cov2 = np.cov(x, bias=True) # rowvar=True by default
assert np.allclose(cov1, cov2)
当对 numpy 矩阵应用零均值时,以下 2 个代码之间是否存在预期差异?我正在学习 andrew ng 的 ML 课程,他建议使用 X @ X^T 来查找协方差矩阵(考虑应用零均值)。当我试图目视检查矩阵时,发现它给出了 np.cov 函数的差异结果。请帮助..
import numpy as np
X=np.random.randint(0,9,(3,3))
print(X)
[[2 1 5]
[7 4 8]
[4 7 6]]
X = (X - X.mean(axis=0)) # <- Zero Mean
print(X)
[[-2.33333333 -3. -1.33333333]
[ 2.66666667 0. 1.66666667]
[-0.33333333 3. -0.33333333]]
cov1 = (X @ X.T)/m # <- Find covariance manually as suggested in the course
print(cov1)
[[ 5.40740741 -2.81481481 -2.59259259]
[-2.81481481 3.2962963 -0.48148148]
[-2.59259259 -0.48148148 3.07407407]]
cov2 = np.cov(X,bias=True) # <- Find covariance with np.cov
print(cov2)
[[ 0.7037037 0.59259259 -1.2962963 ]
[ 0.59259259 1.81481481 -2.40740741]
[-1.2962963 -2.40740741 3.7037037 ]]
如果您的观察值在行中,变量在列中(将 rowvar
设置为 False
),则它必须是 x.T @ x
:
import numpy as np
x0 = np.array([[2, 1, 5], [7, 4, 8], [4, 7, 6]])
x = x0 - x0.mean(axis=0)
cov1 = x.T @ x / 3
cov2 = np.cov(x, rowvar=False, bias=True)
assert np.allclose(cov1, cov2)
x @ x.T
适用于观察值在列中且变量在行中的情况:
x = x0 - x0.mean(axis=1)[:,None]
cov1 = x @ x.T / 3
cov2 = np.cov(x, bias=True) # rowvar=True by default
assert np.allclose(cov1, cov2)