网络上爬了一通协方差、协方差矩阵计算方法,留个备注。
假设:
x = [0, 1, 2, 3, 4]
y = [1, 2, 3, 4, 5]
第一种计算方法
N = x, y的size
E(X) = X的平均值
E(Y) = Y的平均值
E(XY) = (XY逐项相乘的和) / N
Cov(X, Y) = E(XY) - E(X)E(Y)
举例:
E(X) = 2.0
E(Y) = 3.0
E(XY) = (0x1+1x2+2x3+3x4+4x5)/5 = 8.0
Cov(X, Y) = 8.0 - 6.0 = 2.0
上面计算方法结果,对应 numpy中的:
import numpy as np
np.cov(x, y, bias=1)
另一种:
举例
Cov(X, Y) = ((0-2.0)(1-3.0)+(1-2.0)(2-3.0)+(2-2.0)(3-3.0)+(3-2.0)(4-3.0)+(4-2.0)(5-3.0)) / (5 - 1) = 2.5
计算方法结果,对应 numpy中的:
import numpy as np
np.cov(x, y, bias=0)
协方差矩阵
- 数据矩阵:
- 协方差矩阵:
那么在我们的例子里,c1 就是 x,c2就是 y,自己写好一个cov
函数,逐个代入c1, c2就能得到协方差矩阵啦。结果是和 numpy 算出来的一模一样的。
import numpy as np
y = np.array([1,2,3,4,5])
x = np.arange(y.size)
# 第一种
def cov(x, y):
return (x * y).mean() - x.mean() * y.mean()
# 第二种
def cov2(x, y):
return ((x - x.mean()) * (y - y.mean())).sum() / (x.size - 1)
matrix = [[cov(x, x), cov(x, y)], [cov(y, x), cov(y, y)]]
print(matrix)
[[2.0, 2.0], [2.0, 2.0]]