统计与概率 | 协方差矩阵

协方差矩阵又被称为相关系数矩阵. 本文主要介绍协方差矩阵的概念和如何使用 numpy 中的 einsum 进行计算.

概念与定义

协方差

两个向量 $\boldsymbol{x}$ 和 $\boldsymbol{y}$ 的协方差 (covariance) 可以定义为
$$ cov(\boldsymbol{x}, \boldsymbol{y}) = E((\boldsymbol{x} - \mu)(\boldsymbol{y} - \nu)) = E(\boldsymbol{x}\cdot\boldsymbol{y}) - \mu\nu$$

比如,

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$, 对每一对行向量求协方差, 便可以得到协方差矩阵:
$$Cov(X,Y) = \begin{bmatrix}
cov(X_1,Y_1) & cov(X_1,Y_2) & \cdots & cov(X_1,Y_n) \
\vdots & \vdots & \ddots & \vdots \
cov(X_n,Y_1) & cov(X_n,Y_2) & \cdots & cov(X_n,Y_n)
\end{bmatrix}$$

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)

相关系数

一般情况下, 相关系数的公式为
$$\rho = \frac{cov(X,Y)}{\sigma_X \sigma_Y}$$

相关系数可以看做是标准化后的协方差.

Hadamard-Fisher (HF) 互相关

自协方差矩阵

$$E(XX^) = Cov(X,X^)$$

注意这里在求平均值时要除以n-1

Numpy中einsum函数的一个bug Explore | 有趣的问题

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×