协方差的定义

 

对于一般的分布,直接代入E(X)之类的就可以计算出来了,但真给你一个具体数值的分布,要计算协方差矩阵,根据这个公式来计算,还真不容易反应过来。网上值得参考的资料也不多,这里用一个例子说明协方差矩阵是怎么计算出来的吧。

记住,X、Y是一个列向量,它表示了每种情况下每个样本可能出现的数。比如给定

则X表示x轴可能出现的数,Y表示y轴可能出现的。注意这里是关键,给定了4个样本,每个样本都是二维的,所以只可能有X和Y两种维度。所以

 

 

用中文来描述,就是:

协方差(i,j)=(第i列的所有元素-第i列的均值)*(第j列的所有元素-第j列的均值)

这里只有X,Y两列,所以得到的协方差矩阵是2x2的矩阵,下面分别求出每一个元素:

       所以,按照定义,给定的4个二维样本的协方差矩阵为:

 

    

用matlab计算这个例子

z=[1,2;3,6;4,2;5,2]
cov(z)
ans =
    2.9167   -0.3333
   -0.3333    4.0000

可以看出,matlab计算协方差过程中还将元素统一缩小了3倍。所以,协方差的matlab计算公式为:

    协方差(i,j)=(第i列所有元素-第i列均值)*(第j列所有元素-第j列均值)/(样本数-1)

       下面在给出一个4维3样本的实例,注意4维样本与符号X,Y就没有关系了,X,Y表示两维的,4维就直接套用计算公式,不用X,Y那么具有迷惑性的表达了。

 

 

 

    

                

        (3)与matlab计算验证

                 

Z=[1 2 3 4;3 4 1 2;2 3 1 4]
                     cov(Z)
                     ans =
                          1.0000    1.0000   -1.0000   -1.0000
                          1.0000    1.0000   -1.0000   -1.0000
                         -1.0000   -1.0000    1.3333    0.6667
                          -1.0000   -1.0000    0.6667    1.3333

       可知该计算方法是正确的。我们还可以看出,协方差矩阵都是方阵,它的维度与样本维度有关(相等)。


a  
    = 
    
      
    - 
    1 
          
    1 
          
    2 
    
      
    - 
    2 
          
    3 
          
    1 
    
       
    4 
          
    0 
          
    3 
    

 
    for 
     i 
    = 
    1 
    :size(a, 
    2 
    ) 
      
    for 
     j 
    = 
    1 
    :size(a, 
    2 
    ) 
         c(i,j) 
    = 
    sum((a(:,i) 
    - 
    mean(a(:,i))). 
    * 
    (a(:,j) 
    - 
    mean(a(:,j)))) 
    / 
    (size(a, 
    1 
    ) 
    - 
    1 
    );
     end 
 end 
   
c =
   10.3333   -4.1667    3.0000
   -4.1667    2.3333   -1.5000
    3.0000   -1.5000    1.0000 
 
   


 
  
 c为求得的协方差矩阵,在matlab以矩阵a的每一列为变量,对应的每一行为样本。这样在矩阵a中就有3个列变量分别为a(:,1), a(:,2), a(:,3)。
 在协方差矩阵c中,每一个元素c(i,j)为对第i列与第j列的协方差,例如c(1,2) = -4.1667为第一列与第二列的协方差。
 
 拿c(1,2)的求解过程来说
c(1,2)=sum((a(:,1)-mean(a(:,1))).*(a(:,2)-mean(a(:,2))))/(size(a,1)-1);
a(:,1)-mean(a(:,1)),第一列的元素减去该列的均值得到
   -1.3333
   -2.3333
    3.6667
2,  a(:,2)-mean(a(:,2)),第二列的元素减去该列的均值得到
   -0.3333
    1.6667
   -1.3333
3, 再将第一步与第二部的结果相乘
   -1.3333        -0.3333           0.4444
   -2.3333  .*     1.6667  =     -3.8889
    3.6667         -1.3333          -4.8889
 
4, 再将结果求和/size(a,1)-1 得 -4.1667,该值即为c(1,2)的值。
Cov(X,Y) = E{ [ (X-E(X) ] [ (Y-E(Y) ] } 过程基本一致呢,只是在第4步的时候matlab做了稍微的调整,自由度为n-1,减少了一行的样本值个数。