协方差矩阵又被称为相关系数矩阵. 本文主要介绍协方差矩阵的概念和如何使用 numpy 中的 einsum 进行计算.
概念与定义
协方差
两个向量 $\boldsymbol{x}$ 和 $\boldsymbol{y}$ 的协方差 (covariance) 可以定义为
比如,
1 2 3 4 5 6 7
| def cov(x, y): return np.mean(x * y) - np.mean(x)*np.mean(y)
x = np.arange(3) y = x[::-1] print(cov(x,y))
|
对于两个由行向量组成的矩阵 $X=\left[X_1, X_2, \cdots, X_n\right]^T$ 和 $Y=\left[Y_1,Y_2,\cdots,Y_n\right]^T$, 对每一对行向量求协方差, 便可以得到协方差矩阵:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| def norm(X): ret = np.zeros(X.shape) for i, row in enumerate(X): ret[i] = row - np.mean(X,-1)[i] return ret
length = 4 X = np.array([ [1,2,3,4], [3,4,5,6] ]) X = norm(X) print("X =", X) Y = np.array([ [9,8,7,6], [6,5,4,3] ]) Y = norm(Y) print('Y =',Y) Z = np.einsum('ij,kj->ik',X,Y) Z /= length print('Z =', Z)
|
相关系数
一般情况下, 相关系数的公式为
相关系数可以看做是标准化后的协方差.
Hadamard-Fisher (HF) 互相关
自协方差矩阵
注意这里在求平均值时要除以n-1
Comments
shortname
for Disqus. Please set it in_config.yml
.