协方差的意义
什么是协方差,为什么有些地方会用到协方差。
核心意义:度量各个维度偏离其均值的程度。协方差的值如果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),结果为负值就说明负相关的,如果为0,也是就是统计上说的“相互独立”。
正相关和负相关的直观理解:
正相关
特点:当 X, Y 的联合分布像上图那样时,我们可以看出,大致上有: X 越大 Y 也越大, X 越小 Y 也越小,这种情况,我们称为“正相关”。
负相关.png特点:当X, Y 的联合分布像上图那样时,我们可以看出,大致上有:X 越大Y 反而越小,X 越小 Y 反而越大,这种情况,我们称为“负相关”。
不相关特点:当X, Y 的联合分布像上图那样时,我们可以看出:既不是X 越大Y 也越大,也不是 X 越大 Y 反而越小,这种情况我们称为“不相关”。
怎样将这3种相关情况,用一个简单的数字表达出来呢?
在图中的区域(1)中,有 X>EX ,Y-EY>0 ,所以(X-EX)(Y-EY)>0;
在图中的区域(2)中,有 X<EX ,Y-EY>0 ,所以(X-EX)(Y-EY)<0;
在图中的区域(3)中,有 X<EX ,Y-EY<0 ,所以(X-EX)(Y-EY)>0;
在图中的区域(4)中,有 X>EX ,Y-EY<0 ,所以(X-EX)(Y-EY)<0。
重点解释:所谓正相关。只是说某种分布主要覆盖区域(1)与区域(3),例如99.7%数据是这种特性,极少数据覆盖区域(2)与区域(4)
同理,所谓负相关,应该是某种分布主要覆盖(2)、(4),极小部分覆盖(1)、(3)。
所谓不相关,等于(1)(2)(3)(4)分布都差不多。
数值绝对值大小,应该表示这种相关性的强烈程度。
从公式上看:
方差上图是方差的公式,用以度量各个维度偏离其均值的程度。
协方差协方差公式由方差的公式推广而来,用于描述维度之间的线性相关性。
从协方差的定义上我们也可以看出一些显而易见的性质,如:
image
image
具体如何计算?
例如有如下数据:
image.png
每一列表示一个维度,每一行表示一个样本。
如何计算协方差?当然,我们有api,如果不使用api,是否能自己写?我们按照公式,写了如下测试程序:
def means(listx):
sumx = 0
num = 0
for val in listx:
sumx += val
num += 1
return float(sumx)/float(num)
def cov(x,y,x_mean,y_mean):
N = len(x)
sumt = 0.0
for i in range(N):
sumt += (float(x[i]) - x_mean)*(float(y[i]) - y_mean)
return sumt/(N - 1)
x = [10,15,23,11,42,9,11,8,11,21]
y = [15,46,21,9,45,48,21,5,12,20]
z = [29,13,30,35,11,5,14,15,21,25]
N = len(x)
x_mean = means(x)
y_mean = means(y)
z_mean = means(z)
print('维度之间的协方差')
print('cov(x,y) = ', cov(x,y,x_mean,y_mean))
print('cov(x,z) = ', cov(x,z,x_mean,z_mean))
print('cov(y,z) = ', cov(y,z,y_mean,z_mean))
#维度之间的协方差
#cov(x,y) = 74.53333333333335
#cov(x,z) = -10.088888888888889
#cov(y,z) = -106.4
print('cov(x,x) = ', cov(x,x,x_mean,x_mean))
print('cov(y,y) = ', cov(y,y,y_mean,y_mean))
print('cov(z,z) = ', cov(z,z,z_mean,z_mean))
#cov(x,x) = 108.32222222222221
#cov(y,y) = 260.6222222222222
#cov(z,z) = 94.17777777777778
计算出维度之间的协方差,我们就可以组织协方差矩阵。协方差矩阵可以快速定位维度之间的协方差。
上述解释详见下面文章:
#终于明白协方差的意义了