如何求协方差矩阵

理论和例子: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. ]]
文章目录