在信号处理算法中的现代滤波器部分经常会看到协方差矩阵,记录下来备忘。
协方差用来表示两个随机变量的相关程度。-1是负相关,+1是正相关,0是不相关。
例如X和Y的协方差,假设有m个样本samples,那么可以计算:
c
o
v
(
X
,
Y
)
=
E
(
(
X
−
E
X
)
(
Y
−
E
Y
)
)
=
1
m
−
1
∑
i
=
1
m
(
x
i
−
x
‾
)
(
y
i
−
y
‾
)
cov(X,Y) = E((X-EX)(Y-EY))=\frac{1}{m-1}\sum_{i=1}^{m}(x_i-\overline{x})(y_i-\overline{y})
cov(X,Y)=E((X−EX)(Y−EY))=m−11i=1∑m(xi−x)(yi−y)
推广到N维随机变量,且有m个样本的情况,就可以由N个随机变量两两构成协方差矩阵,也就是对称矩阵:
Σ
=
[
c
o
v
(
X
1
,
X
1
)
⋯
c
o
v
(
X
1
,
X
n
)
⋮
⋱
⋮
c
o
v
(
X
n
,
X
1
)
⋯
c
o
v
(
X
n
,
X
n
)
]
\pmb{\Sigma}=
协方差矩阵一般不用逐个计算的方式,而是使用矩阵运算,然后利用像numpy的广播机制加速运算。一般来说求和相乘的运算都可以转化成矩阵乘法运算,然后利用numpy广播机制。求协方差numpy也有接口直接计算:
x = [-2.1, -1, 4.3]
y = [3, 1.1, 0.12]
X = np.stack((x, y), axis=0)
np.cov(X)
>> array([[11.71 , -4.286 ], # may vary
[-4.286 , 2.144133]])
np.cov(x, y)
>>array([[11.71 , -4.286 ], # may vary
[-4.286 , 2.144133]])
np.cov(x)
>>array(11.71)
参考:
Understanding the Covariance Matrix - Parametric Thoughts (janakiev.com)