协方差与相关系数

1.协方差

如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值时另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值;如果两个变量的变化趋势相反,即其中一个变量大于自身的期望值时另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。

可以通俗的理解为:两个变量在变化过程中是同方向变化?还是反方向变化?同向或反向程度如何? 
你变大,同时我也变大,说明两个变量是同向变化的,这时协方差就是正的; 
你变大,同时我变小,说明两个变量是反向变化的,这时协方差就是负的; 
从数值来看,协方差的数值越大,两个变量同向程度也就越大。反之亦然。

Cov(X,Y)=1mi=1m(xix¯)(yiy¯)Cov(X,Y)=1m∑i=1m(xi−x¯)(yi−y¯)
import numpy as np

a = np.array([1,2,3])
b = np.array([4,3,4])
x = np.vstack((a,b))
np.cov(a, b)
np.cov(a, b, bias=True)
np.cov(x)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

输出:

>>> np.cov(a, b)
array([[ 1. , 0. ], [ 0. , 0.33333333]])

>>> np.cov(a, b, bias=True)
array([[ 0.66666667, 0. ], [ 0. , 0.22222222]])

>>> np.cov(x)
array([[ 1. , 0. ], [ 0. , 0.33333333]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这里使用numpy库的cov函数来计算协方差,输出结果为一个协方差矩阵,results[i][j]表示第i个变量与第j个变量的协方差,比如np.cov(x)的结果为

>>> np.cov(x)
array([[ 1. , 0. ], [ 0. , 0.33333333]])
  • 1
  • 2
  • 3

x为变量矩阵,x的第 i 行表示第 i 个随机变量,这里第0个随机变量与第0个随机变量的协方差为1,第0个随机变量与第1个随机变量的协方差为0,第1个随机变量与第0个随机变量的协方差为0,第1个随机变量与第1个随机变量的协方差为0.33333333.

还有一点就是bais参数的意义,默认为False,那么计算均值的时候除以 n - 1,如果设为True,那么计算均值的时候除以n,其中n为随机变量的维度数。具体理论涉及到统计学知识,可以参考知乎回答

numpy的cov函数使用的三点:

  1. 变量矩阵的一行表示一个随机变量;
  2. bais参数控制计算时除以n-1还是n, True表示除以n,False表示除以n-1;
  3. 输出结果是一个协方差矩阵, results[i][j]表示第i个随机变量与第j个随机变量的协方差.

2. 相关系数

相关系数是用以反映变量之间相关关系密切程度的统计指标。相关系数也可以看成协方差:一种剔除了两个变量量纲影响、标准化后的特殊协方差,它消除了两个变量变化幅度的影响,而只是单纯反应两个变量每单位变化时的相似程度。

r=Cov(X,Y)δxδyr=Cov(X,Y)δxδy

并且

|r|1|r|≤1

其中,δx,δyδx,δy表示X,Y的方差。

import numpy as np

a = np.array([1,2,3])
b = np.array([2,5,8])
x = np.vstack((a,b))
np.corrcoef(a, b)
np.corrcoef(x)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

输出

>>> np.corrcoef(a, b)
array([[ 1., 1.], [ 1., 1.]])

>>> np.corrcoef(x)
array([[ 1., 1.], [ 1., 1.]])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

numpy中函数corrcoef的用法与函数cov的用法相似,只是corrcoef中bais参数不起作用。

numpy的cov函数使用的两点:

  1. 变量矩阵的一行表示一个随机变量;
  2. 输出结果是一个相关系数矩阵, results[i][j]表示第i个随机变量与第j个随机变量的相关系数.

[参考]https://www.zhihu.com/question/20852004

收藏