透彻理解:方差、协方差、相关系数、协方差矩阵及其应用
最近看了几篇跨领域特征对齐方面的经典文献,学者们搞了很多花样,如有的提出一阶统计特征对齐,有的提出二阶统计特征对齐,有的学者提出高阶统计特征对齐。
通俗而言,就是在统计特征层面对跨域特征进行对齐,如对齐一阶矩(均值)、二阶矩(方差)、三阶矩(偏度)。为此,本文系统的梳理了一遍概率与统计相关的知识点。
目录
- 1. 方差
- 总体方差
- 样本方差
- 2. 协方差
- 性质
- 3. 相关系数
- 公式推导
- 性质
- 4. 协方差矩阵
- 公式推导
- 5. 总结
1. 方差
随机变量
X
X
X与均值
E
[
X
]
E[X]
E[X]的偏离程度可以表示为
∣
X
−
E
[
X
]
∣
|X-E[X]|
∣X−E[X]∣,为了便于计算考虑
(
X
−
E
[
X
]
)
2
(X-E[X])^2
(X−E[X])2。由于
(
X
−
E
[
X
]
)
2
(X-E[X])^2
(X−E[X])2任是一个随机变量,因此其均值
E
[
(
X
−
E
[
X
]
)
2
]
E[(X-E[X])^2]
E[(X−E[X])2]可以反映随机变量
X
X
X的波动程度,记为
V
(
X
)
=
E
[
(
X
−
E
[
X
]
)
2
]
V(X)=E[(X-E[X])^2]
V(X)=E[(X−E[X])2]
注:本文仅分析离散型随机变量。
总体方差
σ 2 = 1 N ∑ i = 1 N ( x i − μ ) 2 \sigma^2=\frac{1}{N}\sum_{i=1}^{N}(x_i-\mu)^2 σ2=N1i=1∑N(xi−μ)2
式中, σ 2 \sigma^2 σ2表示总体方差, N N N表示总体样本的个数, μ \mu μ表示总体均值。
样本方差
在实际生活中,总体样本是未知的,一般是采用抽样的方法获得部分样本,因为采用无偏估计可以修正样本估计的偏差,计算公式如下:
S
2
=
1
n
−
1
∑
i
=
1
n
(
x
i
−
x
ˉ
)
2
S^2=\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})^2
S2=n−11i=1∑n(xi−xˉ)2
式中,
S
2
S^2
S2表示样本方差,
n
n
n表示抽样的样本个数(观测样本个数),
x
ˉ
\bar{x}
xˉ表示观测的样本均值。
在后续的方差计算中,均是默认采用无偏估计,且在python的一些包中也均采用的是无偏估计。
编程实现:
x = torch.randn(10)
mu = torch.mean(x)
var = torch.sum((x-mu)*(x-mu)) / (10-1) # tensor(0.6017)
内置函数torch.var
:
var = torch.var(x) # tensor(0.6017)
2. 协方差
用于描述二维随机变量
(
X
,
Y
)
(X, Y)
(X,Y)之间的相互关系,定义为
C
o
v
(
X
,
Y
)
=
E
[
(
X
−
μ
X
)
(
Y
−
μ
Y
)
]
Cov(X, Y)=E[(X-\mu_{X})(Y-\mu_{Y})]
Cov(X,Y)=E[(X−μX)(Y−μY)]
式中,
μ
X
,
μ
Y
\mu_{X},\mu_{Y}
μX,μY分别表示随机变量
X
、
Y
X、Y
X、Y的期望。
方差用于描述单个随机变量的波动程度,协方差则是度量二维随机变量的相关程度。当 X = Y X=Y X=Y,则协方差就退化为方差,因此可以认为协方差是方差的一个特例。
性质
关于协方差的一些性质均可以由期望 E [ X ] E[X] E[X]和方差 V [ X ] V[X] V[X]的性质推导得来,毕竟协方差也是方差的一种。因此,下面仅列举了协方差的结论,推导省略。
-
C o v ( X , Y ) > 0 Cov(X,Y)>0 Cov(X,Y)>0:随机变量 X X X和 Y Y Y正相关。
-
C o v ( X , Y ) < 0 Cov(X,Y)<0 Cov(X,Y)<0:随机变量 X X X和 Y Y Y负相关。
-
C o v ( X , Y ) = 0 Cov(X,Y)=0 Cov(X,Y)=0:随机变量 X X X和 Y Y Y不相关。
-
C o v ( X , Y ) = C o v ( Y , X ) Cov(X,Y)=Cov(Y,X) Cov(X,Y)=Cov(Y,X)
-
C o v ( X , X ) = V ( X ) Cov(X,X)=V(X) Cov(X,X)=V(X)
-
C o v ( a X , b Y ) = a b × C o v ( X , Y ) Cov(aX,bY)=ab \times Cov(X,Y) Cov(aX,bY)=ab×Cov(X,Y)
-
C o v ( X + a , Y + b ) = C o v ( X , Y ) Cov(X+a,Y+b)=Cov(X,Y) Cov(X+a,Y+b)=Cov(X,Y)
-
C o v ( X , Y ) = E [ X Y ] − E [ X ] E [ Y ] Cov(X,Y)=E[XY]-E[X]E[Y] Cov(X,Y)=E[XY]−E[X]E[Y]
编程实现:
x = torch.randn(10)
mu_x = torch.mean(x)
y = torch.randn(10)
mu_y = torch.mean(y)
cov_xy = torch.sum((x-mu_x)*(y-mu_y)) / (10-1) # tensor(-0.3363)
内置函数torch.cov
:
xy = torch.stack((x, y)) # size (2, 10)
cov_matrix = torch.cov(xy) # size (2, 2)
cov_xy = cov_matrix[0, 1] # tensor(-0.3363)
由于torch.cov
返回的是协方差矩阵,所以对角线上的是方差,非对角线上的是协方差。(见第4节的分析)
3. 相关系数
协方差数值大小并不能反应相互关系的强弱,如 C o v ( X , Y ) Cov(X,Y) Cov(X,Y)和 C o v ( a X , b Y ) Cov(aX,bY) Cov(aX,bY)两者的协方差值相差 a b ab ab倍,但是他们分布趋势几乎一样。因此,无法直接通过协方差值的大小来判断两个随机变量的分布关系。
C o v ( a X , b Y ) = a b × C o v ( X , Y ) Cov(aX,bY)=ab\times Cov(X,Y) Cov(aX,bY)=ab×Cov(X,Y)
相关系数通过对随机变量进行标准化处理,可以消除这一干扰,统一度量范围,记为
ρ
X
Y
=
C
o
v
(
X
,
Y
)
σ
X
σ
Y
\rho_{XY}=\frac{Cov(X,Y)}{\sigma_X \sigma_Y}
ρXY=σXσYCov(X,Y)
式中,
ρ
X
Y
\rho_{XY}
ρXY记为相关系数,
σ
X
\sigma_X
σX表示随机变量
X
X
X的标准差(
σ
X
=
V
[
X
]
\sigma_X=\sqrt{V[X]}
σX=V[X])。
公式推导
记随机变量
X
、
Y
X、Y
X、Y的期望和标准差分别为
μ
X
,
μ
Y
,
σ
X
,
σ
Y
\mu_X,\mu_Y,\sigma_X,\sigma_Y
μX,μY,σX,σY,标准化处理如下
X
~
=
X
−
μ
X
σ
X
,
Y
~
=
Y
−
μ
Y
σ
Y
\widetilde{X}=\frac{X-\mu_X}{\sigma_X},\ \widetilde{Y}=\frac{Y-\mu_Y}{\sigma_Y}
X
=σXX−μX, Y
=σYY−μY
所以归一化后的随机变量
X
~
、
Y
~
\tilde{X}、\tilde{Y}
X~、Y~协方差为
C
o
v
(
X
~
,
Y
~
)
=
C
o
v
(
X
−
μ
X
σ
X
,
Y
−
μ
Y
σ
Y
)
=
C
o
v
(
X
−
μ
X
,
Y
−
μ
Y
)
σ
X
σ
Y
=
C
o
v
(
X
,
Y
)
σ
X
σ
Y
=
ρ
X
Y
\begin{align*} Cov(\tilde{X},\tilde{Y}) &= Cov(\frac{X-\mu_X}{\sigma_X},\frac{Y-\mu_Y}{\sigma_Y}) \\ &= \frac{Cov(X-\mu_X, Y-\mu_Y)}{\sigma_X \sigma_Y} \\ &= \frac{Cov(X, Y)}{\sigma_X \sigma_Y} \\ &= \rho_{XY} \end{align*}
Cov(X~,Y~)=Cov(σXX−μX,σYY−μY)=σXσYCov(X−μX,Y−μY)=σXσYCov(X,Y)=ρXY
所以,相关系数可以看做是标准化变量的协方差。
性质
1)不受缩放比例的影响。
设
Z
=
a
X
,
W
=
b
Y
Z=aX,W=bY
Z=aX,W=bY,则随机变量
Z
,
W
Z,W
Z,W的相关系数为
ρ
Z
W
=
C
o
v
(
Z
,
W
)
σ
Z
σ
W
=
C
o
v
(
a
X
,
b
Y
)
V
[
a
X
]
V
[
b
Y
]
=
a
b
C
o
v
(
X
,
Y
)
a
2
V
[
X
]
b
2
V
[
Y
]
=
ρ
X
Y
\begin{align*} \rho_{ZW} &= \frac{Cov(Z,W)}{\sigma_Z \sigma_W} \\ &= \frac{Cov(aX,bY)}{\sqrt{V[aX]} \sqrt{V[bY]}} \\ &= \frac{abCov(X,Y)}{\sqrt{a^2V[X]} \sqrt{b^2V[Y]}} \\ &= \rho_{XY} \end{align*}
ρZW=σZσWCov(Z,W)=V[aX]V[bY]Cov(aX,bY)=a2V[X]b2V[Y]abCov(X,Y)=ρXY
2)不受随机变量加减的影响。
设
Z
=
X
+
a
,
W
=
Y
+
b
Z=X+a,W=Y+b
Z=X+a,W=Y+b,则随机变量
Z
,
W
Z,W
Z,W的相关系数为
ρ
Z
W
=
C
o
v
(
Z
,
W
)
σ
Z
σ
W
=
C
o
v
(
X
+
a
,
Y
+
b
)
V
[
X
+
a
]
V
[
Y
+
b
]
=
C
o
v
(
X
,
Y
)
V
[
X
]
V
[
Y
]
=
ρ
X
Y
\begin{align*} \rho_{ZW} &= \frac{Cov(Z,W)}{\sigma_Z \sigma_W} \\ &= \frac{Cov(X+a,Y+b)}{\sqrt{V[X+a]} \sqrt{V[Y+b]}} \\ &= \frac{Cov(X,Y)}{\sqrt{V[X]} \sqrt{V[Y]}} \\ &= \rho_{XY} \end{align*}
ρZW=σZσWCov(Z,W)=V[X+a]V[Y+b]Cov(X+a,Y+b)=V[X]V[Y]Cov(X,Y)=ρXY
编程实现:
x = torch.randn(10)
mu_x = torch.mean(x)
y = torch.randn(10)
mu_y = torch.mean(y)
cov_xy = torch.sum((x-mu_x)*(y-mu_y)) / (10-1) # xy协方差
x_std = torch.std(x) # x的标准差
y_std = torch.std(y) # y的标准差
r_xy = cov_xy / (x_std * y_std) # tensor(0.1423)
内置函数torch.corrcoef
:
xy = torch.stack((x, y)) # size (2, 10)
r_matrix = torch.corrcoef(xy) # size (2,2), 对角线值全为1
r_xy = r_matrix[0,1] # tensor(0.1423)
4. 协方差矩阵
协方差是计算两个随机变量的相关性,协方差矩阵是计算三个及以上随机变量的相关性。假设有三个随机变量 X 1 , X 2 , X 3 X_1,X_2,X_3 X1,X2,X3,则对应的协方差矩阵一览表为
随机变量 | X 1 X_1 X1 | X 2 X_2 X2 | X 3 X_3 X3 |
---|---|---|---|
X 1 X_1 X1 | C o v ( X 1 , X 1 ) Cov(X_1,X_1) Cov(X1,X1) | C o v ( X 1 , X 2 ) Cov(X_1,X_2) Cov(X1,X2) | C o v ( X 1 , X 3 ) Cov(X_1,X_3) Cov(X1,X3) |
X 2 X_2 X2 | C o v ( X 2 , X 1 ) Cov(X_2,X_1) Cov(X2,X1) | C o v ( X 2 , X 2 ) Cov(X_2,X_2) Cov(X2,X2) | C o v ( X 2 , X 3 ) Cov(X_2,X_3) Cov(X2,X3) |
X 3 X_3 X3 | C o v ( X 3 , X 1 ) Cov(X_3,X_1) Cov(X3,X1) | C o v ( X 3 , X 2 ) Cov(X_3,X_2) Cov(X3,X2) | C o v ( X 3 , X 3 ) Cov(X_3,X_3) Cov(X3,X3) |
将上述一览表写成协方差矩阵的形式
Σ
=
[
V
(
X
1
)
C
o
v
(
X
1
,
X
2
)
C
o
v
(
X
1
,
X
3
)
C
o
v
(
X
2
,
X
1
)
V
(
X
2
)
C
o
v
(
X
2
,
X
3
)
C
o
v
(
X
3
,
X
1
)
C
o
v
(
X
3
,
X
2
)
V
(
X
3
)
]
3
×
3
\Sigma= \begin{bmatrix} V(X_1) & Cov(X_1,X_2) & Cov(X_1, X_3) \\ Cov(X_2, X_1) & V(X_2) & Cov(X_2, X_3) \\ Cov(X_3, X_1) & Cov(X_3,X_2) & V(X_3) \end{bmatrix} _{3\times 3}
Σ=
V(X1)Cov(X2,X1)Cov(X3,X1)Cov(X1,X2)V(X2)Cov(X3,X2)Cov(X1,X3)Cov(X2,X3)V(X3)
3×3
式中,
Σ
\Sigma
Σ表示协方差矩阵,
V
(
X
)
V(X)
V(X)表示随机变量的方差,
V
(
X
)
=
C
o
v
(
X
,
X
)
V(X)=Cov(X,X)
V(X)=Cov(X,X)。
一般而言, σ 2 \sigma^2 σ2表示方差,大写的*\Sigma*表示协方差矩阵 Σ \Sigma Σ。
为了提高代码的效率,一般采用向量化编程思想计算多个随机变量的协方差矩阵
Σ
\Sigma
Σ
Σ
=
E
[
(
X
−
μ
)
(
X
−
μ
)
T
]
\Sigma = E[(\bold{X}-\boldsymbol{\mu})(\bold{X}-\boldsymbol{\mu})^T]
Σ=E[(X−μ)(X−μ)T]
式中,
X
∈
R
d
×
n
,
μ
∈
R
d
×
1
,
Σ
∈
R
d
×
d
\bold{X}\in \R^{d\times n},\boldsymbol{\mu}\in \R^{d\times 1}, \Sigma \in \R^{d\times d}
X∈Rd×n,μ∈Rd×1,Σ∈Rd×d,
n
n
n是观测样本的个数,
d
d
d是随机变量的个数,
μ
\boldsymbol{\mu}
μ是均值向量,包含了每个随机变量对应的均值。
补充理解:
- X = [ X 1 、 X 2 、 X 3 ] \bold{X}=[X_1、X_2、X_3] X=[X1、X2、X3]包含了三个随机变量。
- 可以从随机变量 X 1 X_1 X1中取值,这些取出来的值称为观测样本,因为离散型随机变量的取值为有限个值(或可列个值),如从中取出 n n n个观测样本 { x 1 , x 2 , . . . , x n } \{x_1,x_2,...,x_n\} {x1,x2,...,xn}。
- 对应于我们的训练样本则 n n n是训练样本个数, d d d是每个样本对应的特征维数。
公式推导
下面以随机变量个数为3,推导上述公式成立
X
=
[
X
1
,
X
2
,
X
3
]
T
μ
=
E
[
X
]
=
[
μ
1
,
μ
2
,
μ
3
]
T
X
−
μ
=
[
X
1
−
μ
1
,
X
2
−
μ
2
,
X
3
−
μ
3
]
T
\begin{align*} \bold{X} &= [X_1, X_2, X_3]^T \\ \boldsymbol{\mu} &= E[X]=[\mu_1,\mu_2,\mu_3]^T \\ \bold{X} - \boldsymbol{\mu} &= [X_1-\mu_1, X_2-\mu_2, X_3-\mu_3]^T \end{align*}
XμX−μ=[X1,X2,X3]T=E[X]=[μ1,μ2,μ3]T=[X1−μ1,X2−μ2,X3−μ3]T
则有
E
[
(
X
−
μ
)
(
X
−
μ
)
T
]
=
E
[
(
X
1
−
μ
1
,
X
2
−
μ
2
,
X
3
−
μ
3
)
T
×
(
X
1
−
μ
1
,
X
2
−
μ
2
,
X
3
−
μ
3
)
]
=
E
[
(
(
X
1
−
μ
1
)
2
(
X
1
−
μ
1
)
(
X
2
−
μ
2
)
(
X
1
−
μ
1
)
(
X
3
−
μ
3
)
(
X
2
−
μ
2
)
(
X
1
−
μ
1
)
(
X
2
−
μ
2
)
2
(
X
2
−
μ
2
)
(
X
3
−
μ
3
)
(
X
3
−
μ
3
)
(
X
1
−
μ
1
)
(
X
3
−
μ
3
)
(
X
2
−
μ
2
)
(
X
3
−
μ
3
)
2
)
]
=
(
V
(
X
1
)
C
o
v
(
X
1
,
X
2
)
C
o
v
(
X
1
,
X
3
)
C
o
v
(
X
2
,
X
1
)
V
(
X
2
)
C
o
v
(
X
2
,
X
3
)
C
o
v
(
X
3
,
X
1
)
C
o
v
(
X
3
,
X
2
)
V
(
X
3
)
)
\begin{align*} & E[(\bold{X} - \boldsymbol{\mu} )(\bold{X} - \boldsymbol{\mu} )^T] \\ &= E[(X_1-\mu_1, X_2-\mu_2, X_3-\mu_3)^T \times (X_1-\mu_1, X_2-\mu_2, X_3-\mu_3)] \\ &= E \begin{bmatrix} \begin{pmatrix} (X_1-\mu_1)^2 & (X_1-\mu_1)(X_2-\mu_2) & (X_1-\mu_1)(X_3-\mu_3) \\ (X_2-\mu_2)(X_1-\mu_1) & (X_2-\mu_2)^2 & (X_2-\mu_2)(X_3-\mu_3) \\ (X_3-\mu_3)(X_1-\mu_1) & (X_3-\mu_3)(X_2-\mu_2) & (X_3-\mu_3)^2 \end{pmatrix} \end{bmatrix} \\ &= \begin{pmatrix} V(X_1) & Cov(X_1,X_2) & Cov(X_1, X_3) \\ Cov(X_2, X_1) & V(X_2) & Cov(X_2, X_3) \\ Cov(X_3, X_1) & Cov(X_3,X_2) & V(X_3) \end{pmatrix} \end{align*}
E[(X−μ)(X−μ)T]=E[(X1−μ1,X2−μ2,X3−μ3)T×(X1−μ1,X2−μ2,X3−μ3)]=E
(X1−μ1)2(X2−μ2)(X1−μ1)(X3−μ3)(X1−μ1)(X1−μ1)(X2−μ2)(X2−μ2)2(X3−μ3)(X2−μ2)(X1−μ1)(X3−μ3)(X2−μ2)(X3−μ3)(X3−μ3)2
=
V(X1)Cov(X2,X1)Cov(X3,X1)Cov(X1,X2)V(X2)Cov(X3,X2)Cov(X1,X3)Cov(X2,X3)V(X3)
编程实现:
S = torch.randn(5, 32) # 5个样本,每个样本特征维度32
X = S.T
mu = X.mean(1).reshape(-1, 1) # 计算X每行的均值
x = (X - mu) @ (X - mu).T
cov_x1 = x / (5-1) #协方差矩阵
内置函数torch.cov
:
cov_x2 = torch.cov(S.T) # 计算协方差矩阵
# 验证cov_x1与cov_x2是否相等
diff = (cov_x1 - cov_x2).sum() # diff=0
需要注意的是,torch.cov(input)
的输入input要求大小为
d
×
n
d\times n
d×n,
n
n
n代表的是观测样本的个数,也就是训练数据的样本个数;
d
d
d代表的是随机变量的个数,可以理解为样本的特征维数。
所以在输入torch.cov
之前,需要将训练样本
X
∈
R
n
×
d
X \in \R^{n\times d}
X∈Rn×d进行转置。
5. 总结
-
如果需要评价相关性或相似性,前提是变量之间本身就具有线性关系,否则上述评价方法失效。
-
期望是一阶矩(一阶原点矩),方差(协方差)是二阶矩(二阶中心距)。
-
在深度学习相关的方法中,可能会引入上述相关的统计特征对分布偏差进行约束。
参考:
[1]《概率论与数理统计教程》茆诗松等。
[2] 《程序员的数学2 概率统计》平冈和幸等。
[3] wiki-方差