基础知识-协方差
协方差其意义:
度量各个维度偏离其均值的程度。协方差的值如果为正值,则说明两者是正相关的(从协方差可以引出“相关系数”的定义),结果为负值就说明负相关的,如果为0,也是就是统计上说的“相互独立”。
如果正相关,这个计算公式,每个样本对(Xi, Yi), 每个求和项大部分都是正数,即两个同方向偏离各自均值,而不同时偏离的也有,但是少,这样当样本多时,总和结果为正。下面这个图就很直观。下面转载自:http://blog.csdn.net/wuhzossibility/article/details/8087863
在概率论中,两个随机变量 X 与 Y 之间相互关系,大致有下列3种情况:
当 X, Y 的联合分布像上图那样时,我们可以看出,大致上有: X 越大 Y 也越大, X 越小 Y 也越小,这种情况,我们称为“正相关”。
当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。
当X 与Y 正相关时,它们的(联合)分布大部分在区域(1)和(3)中,小部分在区域(2)和(4)中,所以平均来说,有E(X-EX)(Y-EY)>0 。(可以从一维 x~N(μ,σ)的大部分的分布(-3σ-3σ)99.7%的区间取值来理解,当符合条件的X和Y区域都在这(1)(3)区间,X-EX和Y-EY的数值同大于0和小于0的居多,其乘积大于0(是一个三维立体型吧,会根据概率密度p(x)来决定该区域数值,),且其对应数值相乘(X-EX)(Y-EY)越大偏离越大)
当 X与 Y负相关时,它们的分布大部分在区域(2)和(4)中,小部分在区域(1)和(3)中,所以平均来说,有(X-EX)(Y-EY)<0 。
当 X与 Y不相关时,它们在区域(1)和(3)中的分布,与在区域(2)和(4)中的分布几乎一样多,所以平均来说,有(X-EX)(Y-EY)=0 。
所以,我们可以定义一个表示X, Y 相互关系的数字特征,也就是协方差
cov(X, Y) = E(X-EX)(Y-EY)
当 cov(X, Y)>0时,表明 X与Y 正相关;
当 cov(X, Y)<0时,表明X与Y负相关;
当 cov(X, Y)=0时,表明X与Y不相关。
这就是协方差的意义。
另外补充:
1.
求特征协方差矩阵,如果数据是3维,那么协方差矩阵是
这里只有x和y,求解得
对角线上分别是x和y的方差,非对角线上是协方差。协方差大于0表示x和y若有一个增,另一个也增;小于0表示一个增,一个减;协方差为0时,两者独立。协方差绝对值越大,两者对彼此的影响越大,反之越小。
原文链接:https://blog.csdn.net/GoodShot/article/details/79940438
相关系数
相关关系是一种非确定性的关系,相关系数是研究变量之间线性相关程度的量。由于研究对象的不同,相关系数有如下几种定义方式。简单相关系数:又叫相关系数或线性相关系数,一般用字母r 表示,用来度量两个变量间的线性关系。
就是用X、Y的协方差除以X的标准差和Y的标准差。 所以,相关系数也可以看成协方差:一种剔除了两个变量量纲影响、标准化后的特殊协方差。
既然是一种特殊的协方差,那它:
1、也可以反映两个变量变化时是同向还是反向,如果同向变化就为正,反向变化就为负。
2、由于它是标准化后的协方差,因此更重要的特性来了:它消除了两个变量变化幅度的影响,而只是单纯反应两个变量每单位变化时的相似程度。
numpy求两个向量的协方差与相关系数矩阵
import numpy as np import matplotlib.pyplot as plt bhp = np.loadtxt('BHP.csv', delimiter=',', usecols=(6,), unpack=True) print(bhp) ''' [ 93.72 95.64 94.56 93.3 93.93 92.39 92.11 92.36 91.76 93.91 94.6 93.27 94.43 96.02 95.76 94.47 94.34 92.22 88.31 89.59 89.02 86.95 84.88 87.38 88.56 89.59 88.71 90.02 91.26 90.67] ''' bhp_returns = np.diff(bhp) / bhp[:-1] # bhp中相邻两项之间的差除以被减数 vale = np.loadtxt('VALE.csv', delimiter=',', usecols=(6,), unpack=True) print(vale) ''' [ 34.37 35.13 35.14 35.31 35.57 35.03 33.44 33.94 34.21 34.27 34.23 33.76 34.32 34.87 34.5 33.23 33.29 32.88 31.91 32.17 32.44 31.91 31.04 31.51 32.14 32.42 32.25 32.7 32.36 32.34] ''' vale_returns = np.diff(vale) / vale[:-1] # vale中相邻两项之间的差除以被减数 covariance = np.cov(bhp_returns, vale_returns) # 使用np.cov计算股票收益率的协方差矩阵 print(covariance) ''' [[ 0.00028179 0.00019766] [ 0.00019766 0.00030123]] ''' print(covariance.diagonal()) # [ 0.00028179 0.00030123] # 使用diagonal函数查看对角线上的元素 print(covariance.trace()) # 0.00058302354992 # 使用trace函数计算矩阵的迹,即对角线上元素之和 # 两个向量的相关系数被定义为协方差除以各自的标准差的乘积 # 相关系数的取值范围在-1到1之间 # 一组数值与自身的相关系数为1 print(covariance / (bhp_returns.std() * vale_returns.std())) ''' [[ 1.00173366 0.70264666] [ 0.70264666 1.0708476 ]] ''' print(covariance / (bhp_returns.std(ddof=1) * vale_returns.std(ddof=1))) ''' [[ 0.96719112 0.67841747] [ 0.67841747 1.03392182]] ''' # 使用corrcoef函数计算两个向量的相关系数 print(np.corrcoef(bhp_returns, vale_returns)) ''' [[ 1. 0.67841747] [ 0.67841747 1. ]] ''' # 对角线上的元素即BHP和VALE与自身的相关系数,均为1 # 如果两个股票的差值偏离了平均差值2倍于标准差的距离,则认为两只股票不同步 difference = bhp - vale avg = np.mean(difference) dev = np.std(difference) print(np.abs(difference[-1] - avg) > 2 * dev) # False t = np.arange(len(bhp_returns)) plt.plot(t, bhp_returns, lw=1) plt.plot(t, vale_returns, lw=2) plt.show()