如何求协方差矩阵
理论和例子:https://www.cnblogs.com/geeksongs/p/11190295.html
大佬手写的一个例子(注意大佬的样例的每一列指一个样本):https://blog.csdn.net/Harry_Jack/article/details/109280048
协方差的图形理解:https://www.cnblogs.com/nsnow/p/4758202.html
协方差的numpy写法:https://blog.csdn.net/u013521296/article/details/84714310
公式:
$$ Cov(X,Y) = E[(X-E[X])(Y-E[Y])] $$
假如说现在的样本是图像上的点(x,y),即二维向量
下面给出了3个样本点
(1,3)
(2,1)
(3,1)
现在要计算x与y之间的协方差即
$$ Cov(x,y) $$
那么此时公式中的X就是所有样本中x组成的向量
$$ X = [1,2,3] $$
$$ Y = [3,1,1] $$
$$ E[X]=(1+2+3)/3=2 $$
$$ X-E[X] = [-1,0,1] $$
$$ E[Y] = (3+1+1)/3=5/3 $$
$$ Y-E[Y] = [4/3,-2/3,-2/3] $$
$$ (X-E[X])(Y-E[Y])^T = [-1,0,1]*[4/3,-2/3,-2/3]^T = -2 $$
即:
$$ Cov(x,y) = E[(X-E[X])(Y-E[Y])] = E[-2] = -2 $$
这里的E不起作用,因为是在计算两个元素之间的相关性,不是在计算协方差矩阵,协方差矩阵计算时最后一般会乘以一个1/n或者1/(n-1),不影响协方差矩阵反应元素与元素之间的相关性。
协方差是如何反应元素与元素之间的相关性的呢?
从计算方式就可以看出来,首先先计算所有x的平均值,这表示了x这个随机变量的平均大小。取一个样本,其x比这个均值大,那么 $x-\mu x > 0$ 。
在X-E[X]中体现在其结果的正负性上
$$ X-E[X] = [-1,0,1] $$
从这个结果的正负性上便可知这个样本的x比均值大还是比均值小
第二个元素y也是这样
$$ Y-E[Y] = [4/3,-2/3,-2/3] $$
为了方便我们定义dx,dy
$$ dx = X-E[X], dy = Y-E[Y] $$
可知dx = [-1,0,1], dy = [4/3,-2/3,-2/3]
注:
正相关表示一个变量大的时候,另一个变量也大,如y=5x
负相关表示一个变量大的时候,另一个变量小,如y=-5x
可知,第一个样本中的dx[0]=-1,比样本均值小,dy[0]=4/3,比均值大,仅从这一个样本来说,我们可以得出x与y是负相关的。
但是一个样本可能不能准确的反应x与y的真实的相关性,那么简单的想法就是统计所有的样本的关系,取平均值。
由于正数乘正数还是正数,负数乘负数也是正数,而正数乘负数是负数。
我们正好可以用乘法结果的正负性来表示两个数之间是否是正相关。
当两个数正相关时,两种情况,
1,一个数表现的比均值大,此时另一个数表现的也比均值大,正数乘正数,结果为正数,表示正相关。 2,一个数表现的比均值小,此时另一个数表现的也比均值小,负数乘负数,结果还为正数,表示正相关。
当两个数负相关时,一种情况,
一个数表现的比均值大时,此时另一个数表现的比均值小,正数乘负数,结果为负数,表示负相关。
计算为:
dx[0]*dy[0] = -4/3,负相关
dx[1]*dy[1] = 0, 不相关
dx[2]*dy[2]=-2/3,负相关
加在一起,作为一个统计结果为:
(-4/3)+0+(-2/3) = -2
最终的结论是:x与y 是负相关。
这里如果你说因为用到了3个样本,所以结果除以3,我觉得也有道理,但是也没有必要,协方差仅仅是用来表现元素与元素之间的相关性的,数值结果只有相对大小意义没有绝对大小意义,就是说,如果在算一个3维数据(x,y,z)的协方差,Cov(x,y)=-2,Cov(x,z)=-4,那么说明 x 与 z 的负相关程度更高,这个绝对大小-4,并没有什么实际意义。
画在图像上表现为一个斜率为负数的一个分布:
协方差矩阵的求解时,会直接使用所用样本作为一个矩阵,使用矩阵来计算。
这时公式就不是
$$ Cov(X,Y)=E[(X-E[X])(Y-E[Y])] $$
而是:
$$ Cov(X,X)=E[(X-E(X))(X-E(X))^T] $$
X = [
[1,2,3],
[3,1,1]
]
E[X] = [
2,
5/3
]
X-E[X] = [
[-1,0,1],
[4/3,-2/3,-2/3]
]
(X-E(X))(X-E(X))^T = [
[2,-2],
[-2,8/3]
]
Cov(X,X)=E[(X-E(X))(X-E(X))^T] = 1/(3-1)* [
[2,-2],
[-2,8/3]
]
= [
[1,-1],
[-1,4/3]
]
其中最后的 1/(3-1) 中的3指的是样本数量是3
根据样本是竖着表示,还是横着表示,numpy有两种算法,是不一样的,注意
numpy 代码:
import numpy as np
a = [[1, 2, 3], [3, 1, 1]]
def row_var_cov():
c = np.cov(a)
print(c)
def column_var_cov():
c = np.cov(a, rowvar=False)
print(c)
if __name__ == '__main__':
row_var_cov()
column_var_cov()
结果:
[[ 1. -1. ]
[-1. 1.33333333]]
[[ 2. -1. -2. ]
[-1. 0.5 1. ]
[-2. 1. 2. ]]