博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

方差var、协方差cov、协方差矩阵

Posted on 2014-01-07 19:49  xzchen_cg  阅读(7174)  评论(0)    收藏  举报
方差 variance:
    方差是各个数据与平均数之差的平方的平均数。在概率论与数理统计中,方差(英文Variance)用来度量随机变量和其数学期望(即均值)之间的偏离程度。方差是各个数据与平均数之差的平方和的平均数,即s=(1/n)[(x1-x_)^2+(x2-x_)^2+...+(xn-x_)^2,其中,x_表示样本的平均数,n表示样本的数量,^,xn表示个体,而s就表示方差。
       而当用(1/n)[(x1-x_)^2+(x2-x_)^2+...+(xn-x_)^2]作为样本X的方差的估计时,发现其数学期望并不是X的方差,而是X方差的(n-1)/n倍,[1/(n-1)][(x1-x_)^2+(x2-x_)^2+...+(xn-x_)^2]的数学期望才是X的方差,用它作为X的方差的估计具有“无偏性”,所以我们总是用[1/(n-1)]∑(xi-X~)^2来估计X的方差,并且把它叫做“样本方差”。(注意:这点很重要
      设X是一个随机变量,若E{[X-E(X)]^2}存在,则称E{[X-E(X)]^2}为X的方差,记为D(X)或DX。

  即D(X)=E{[X-E(X)]^2}称为方差,而σ(X)=D(X)^0.5(与X有相同的量纲)称为标准差(均方差)。即用来衡量一组数据的离散程度的统计量
  方差刻画了随机变量的取值对于其数学期望的离散程度。即,D(X)是刻画X取值分散程度的一个量,它是衡量X取值分散程度的一个尺度。若X的取值比较集中,则方差D(X)较小;若X的取值比较分散,则方差D(X)较大。  

…………………………………………………………………………………………………………………………………
协方差 covariance 
        在概率论和统计学中,协方差用于衡量两个变量的总体误差,是一个衡量线性独立的无量纲的数。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。
 
  期望值分别为E(X) = μ 与 E(Y) = ν 的两个实数随机变量XY之间的协方差定义为:COV(X,Y)=E[(X-E(X))(Y-E(Y))]  (注:COV(X,Y) = E(XY) - E(X)E(Y) 推导过程为原式做因式分解,神马?你没学过因式分解&¥%@#¥@%&*方差var、协方差cov、协方差矩阵(浅谈)-(一)方差var、协方差cov、协方差矩阵(浅谈)-(一)方差var、协方差cov、协方差矩阵(浅谈)-(一)!!!)
 
       直观上来看,协方差表示的是两个变量总体误差的方差,这与只表示一个变量误差的方差不同。  如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。  如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
    如果XY是统计独立的,那么二者之间的协方差就是0,反之则不成立(我偷下懒,这个知识可以回去看看数理统计)
………………………………………………………………………………………………………………………………
协方差矩阵 covariance matrix 
     在概率论和统计学中,,协方差矩阵是一个矩阵,其每个元素是各个向量元素之间的协方差。是从标量随机变量(也就是单维或单值随机变量)到高维度随机向量的自然推广。
  假设 X 是以 n 个标量随机变量(看做n个变量)组成的行向量,并且μk 是其第k个元素的期望值, 即, μk = E(Xk), 协方差矩阵然后被定义为:  Σ=E{(X-E[X])(X-E[X])T}
 
(这儿插一句:无论你要求的X样本有多少,假设为m个,求出的协方差矩阵都是n阶方阵)
 
  矩阵中的第(i,j)个元素是变量Xi与变量Xj的协方差. 这个概念是对于标量随机变量方差的一般化推广。
 
  尽管协方差矩阵很简单,可它却是很多领域里的非常有力的工具。它能导出一个变换矩阵,这个矩阵能使数据完全去相关(decorrelation)。从不同的角度看,也就是说能够找出一组最佳的基以紧凑的方式来表达数据。(完整的证明请参考瑞利商)。这个方法在统计学中被称为主成分分析(principal components analysis),在图像处理中称为KL-变换。
 
可能你还是会对协方差矩阵迷迷糊糊的,没关系,表着急,接着往后看

    看完了三个概念之后,我们对三个概念有了一定了解(最起码公式要好好看看吧方差var、协方差cov、协方差矩阵(浅谈)-(二)_函数var

 

    下面,我们来进入正题,说说matlab中的方差函数var 还有 协方差函数cov ,对于这两个函数,当然我们可以通过 matlab中help两下解决,但无奈对于英语是心有余而力不足方差var、协方差cov、协方差矩阵(浅谈)-(二)_函数var,假如看官自认为英语还不错的话,你可以去help matlab去了。

    好了,忠诚的小鸟们,开始上课:

    这节咱们讲的是matlab中的方差函数var的用法及具体分析 , var 是用来求方差的,但是首先我们应该清楚的区分两个概念,即方差样本方差的无偏估计,简要来说(你要是不想简要,详细细内容可以看上一篇方差var、协方差cov、协方差矩阵(浅谈)-(二)_函数var)就是,方差公式中分母上是N,而样本方差无偏估计公式中分母上是N-1 (N为样本个数)。

   

    OK!正题!

函数名称: var

 

函数功能:求解方差

 

函数用法:var(X)   %与var(X,0)相同

          var(X,W)

          var(X,W,dim)

 

注:var(X,W)  % W可以取0或1,取0求样本方差的无偏估计值(除以N-1;对应取1求得的是方差(除以N), W也可以是向量,但必须与X中的第一个维度数相同,即length(W)= size(X,1)          
  所以还存在:  var(X ,0 ,dim) % 除以N dim =1 对每列操作  dim = 2 对每行操作

                var(X ,1 ,dim) % 除以N-1 dim =1 对每列操作  dim = 2 对每行操作

   

    var(X,W,dim)   % 关于W取向量时,把W看做X中观察值发生的次数(或者说概率也行)

 

下面详细介绍秘籍:

.........................................................
对于X是向量时,把向量中每个元素看做一个样本
var(X)或者var(X,0)函数输出这个向量中元素的样本方差的无偏估计值,var(X,1)输出的是样本方差

例1:

>> a = [1 6 1 4];
>> aa = var(a)

aa =

     6

>> a_var = var(a,1)

a_var =

    4.5000

>> (sum((a-mean(a)).^2))/(length(a))

ans =

    4.5000


............................................................

对于X是矩阵时

把每行看做一个观察值,每列看做一个变量,函数输出一个行向量,每个元素计算的是该列的方差

例2:

>> X= [1 6 6;4 2 5;7 2 3]

X =

     1     6     6
     4     2     5
     7     2     3

>> XX=var(X)

XX =

    9.0000    5.3333    2.3333

>>  (sum((X-repmat(mean(X),3,1)).^2))/(size(X,1)-1)  %验证

ans =

    9.0000    5.3333    2.3333

>> X_var = var(X,1)

X_var =

    6.0000    3.5556    1.5556
>> (sum((X-repmat(mean(X),3,1)).^2))/(size(X,1))  %验证

ans =

    6.0000    3.5556    1.5556
——————————————————————————————
对于var(X ,0 ,dim) 或者 var(X ,1 ,dim) 前面已说 0 对应 除以N-1; 1对应除以N; dim 指维度信息,默认为1,dim =1 就指对每列操作; dim =2 就指对每行操作。

 

下面以 var(X ,0 ,dim) 为例进行试验验证:

参考结果:默认为1情况↑(往上看)

>> var(X ,0 ,2)

ans =

    8.3333
    2.3333
    7.0000

>> Y = X';
>> var(Y)

ans =

    8.3333    2.3333    7.0000  (一样吧)


...............................................................

对于 var(X,W)、var(X,W,dim) 中W为向量的情况:

把W看做X中对应观察值发生的次数(或者说概率也行)处理,为了清除,现粘贴matlab部分源代码(笔者好心已加注释)如下:

function y = var(x,w,dim)


%   The weighted variance for a vector X is defined as
%
%      VAR(X,W) = SUM(W.*RESID.*CONJ(RESID)) / SUM(W)
%
%   where now RESID is computed using a weighted mean.

    wresize = ones(1,max(ndims(x),dim)); wresize(dim) = n;
    w = reshape(w ./ sum(w), wresize);                     

      % w 看做是x中每个观察值的出现次数,这样w ./ sum(w)即使每个观察样本出现的概率,
    x0 = bsxfun(@times, w, x);                             

      %根据这个概率权重求出期望值或者平均值sum(x0, dim)
    x = bsxfun(@minus, x, sum(x0, dim));                   

      %where now RESID is computed using a weighted mean. 这儿就是那个RESID
    y = sum(bsxfun(@times, w, abs(x).^2), dim);            

逐行验证:

>> clear
>> x= [1 6 6;4 2 5;7 2 3]

x =

     1     6     6
     4     2     5
     7     2     3

>> w = [1 2 3];
>> dim = 1 ;
>> n = size(x ,dim)

n =

     3

>> wresize = ones(1,max(ndims(x),dim))

wresize =

     1     1

>> wresize(dim) = n

wresize =

     3     1

>> w = reshape(w ./ sum(w), wresize)

w =

    0.1667
    0.3333
    0.5000

>> x0 = bsxfun(@times, w, x)

x0 =

    0.1667    1.0000    1.0000
    1.3333    0.6667    1.6667
    3.5000    1.0000    1.5000

>> x = bsxfun(@minus, x, sum(x0, dim));
>>  y = sum(bsxfun(@times, w, abs(x).^2), dim)

y =

    5.0000    2.2222    1.4722

>> var (x,w)  %验证下成果

ans =

    5.0000    2.2222    1.4722

你要是还感觉晕的话(方差var、协方差cov、协方差矩阵(浅谈)-(二)_函数var),下面以第一列为例说明W作用

>> X= [1 6 6;4 2 5;7 2 3];
>> a = X(:,1);                 %取出第一列
>> b = w ./ sum(w);            %求出概率矩阵
>> a0=a.*b;                   
>> a1=sum(a0);                 %求出第一列在W概率加权下的平均值
>> a2=a -a1;
>> c = w.*(a2.^2)              %W看做是每个观察值的出现次数,求出在此加权下的方差
>> sum(c)

ans =

     5

注意: 需要注意的是,这种情况下求出的是样本的统计方差(也就是除以N的那种,因为式中w ./ sum(w)),并非样本方差无偏估计值

当然对于var(X,W,dim)中dim=1(对每列求方差)dim=2(对每行求方差)也可以进行验证,由于方式基本与之前的相同,在此不再赘述

废话不多说,这节都是干货

  我们继续讲第二个函数cov,需要区分的还是两个概念:协方差样本协方差无偏估计值,此部分参考了博客相关内容http://blog.csdn.net/raocong2010/article/details/5941602,如图:

 

图中三个式子分别表示了样本的平均值、样本方差无偏估计值、样本协方差的无偏估计值,如果把S、C中的N-1换做N就成了表示方差与协方差了。

 

好了,开工!

函数名称:cov

函数功能: 求协方差矩阵

函数用法: cov(X)      % cov(X,0) = cov(X)
           cov(X,Y)    % X,Y必须是各维数都相同的矩阵
           cov(X,1)    % 除以N而不是N-1                   
           cov(X,Y,1)  % 除以N而不是N-1 
          

 

详细描述:
......................................................................
if X is a vector向量,cov(X)输出的是这个向量的方差

例:

>> A = [4 1 3];
>> AA = cov(A)

AA =

    2.3333

>> a = mean(A)

a =

    2.6667

>> AAA = 1/3*((4-a)^2+(1-a)^2+(3-a)^2)

AAA =

    1.5556

>> AAAA= 1/2*((4-a)^2+(1-a)^2+(3-a)^2)            %同样,这个方差不是真正意义的方差,而是对样本统计方差的一个无偏估计值

AAAA =

    2.3333
..............................................................................

对于矩阵: 详细内容http://blog.csdn.net/raocong2010/article/details/5941602

For matrices, where each row is an observation, and each column is a variable, cov(X) is the covariance matrix.

对于矩阵来说,matlab把每行看做一个观察值,把每列当做一个变量,也就是说对于一个4*3的矩阵求协方差矩阵,matlab会认为存在三个变量,即会求出一个3*3的协方差矩阵
其中,对角线元素为对应变量的方差无偏估计值,其他位置为对应变量间的 协方差无偏估计值(即除的是N-1)

但是需要注意的事,matlab在计算相关矩阵时,虽然把每一列的数作为一个随机变量的样本,但每一行必须作为一个这几个随机变量的联合样本
即第i个随机变量取第k行的样本值时,第j个随机变量也取第k行的样本值。
知道了这一点,我们就可以用协方差的公式代入来计算协方差矩阵了。

下面是一段算法的实现代码:
clc; 
clear all; 
 
M = 5 
N = 3; 
 
% 生成一个M*N的随机原始矩阵 
OriginMatrix = rand( M, N ); 
 
% 使用自带的cov函数计算相关矩阵 
CovMatrix = cov( OriginMatrix ); 
 
MeanArray = mean( OriginMatrix ); 
MeanMatrix = ones( M, 1 ) * MeanArray; 
 
% 得到每列减去每列均值的的矩阵 
OriginSubMean = OriginMatrix - MeanMatrix; 
 
% 计算出相关矩阵 
if M == 1 
    CovMatrixComputed = OriginSubMean' * OriginSubMean / M; 
else 
    CovMatrixComputed = OriginSubMean' * OriginSubMean / ( M-1 ); 
end 

.......................................................................
例1:
>> X = [1 5 6; 4 3 9 ; 4 2 9; 4 7 2]

X =

     1     5     6
     4     3     9
     4     2     9
     4     7     2

>> Y = cov(X)

Y =

    2.2500   -0.7500    0.5000
   -0.7500    4.9167   -7.1667
    0.5000   -7.1667   11.0000

为探究过程,以Y(1,1)和Y(1,2)为例进行验证

>> x=X(:,1);
>> sum((x-3.25).^2)/3

ans =

    2.2500

>> y = X (:,2);

>>  aa = x'*y/3  %需要注意的是,每行看做一个观察值,每列看做一个变量,也就是说,每行显示的是联合观察值,加入对于第一个变量我们取1 ,那么第二个变量就肯定取5,第三个变量就肯定是6

aa =

   -0.7500

......................................................

对于cov(X,Y)

X、Y必须是各维数都相等的矩阵,其功能是把X中所有元素看做一个变量的样本,Y中所有元素看做另外一个变量的样本,把矩阵中每个对应位置看做一个联合观察值

函数实现的是求出两个变量的协方差矩阵

例2:

>> X

X =

     1     5     6
     4     3     9
     4     2     9
     4     7     2
>> Y = [1 6 7; 7 5 9 ; 1 6 4 ; 2 9 2]

Y =

     1     6     7
     7     5     9
     1     6     4
     2     9     2
>> cov(X,Y)

ans =

    6.9697    4.4242
    4.4242    8.4470

现在用(1,1)和(1,2)位置验证

>> sum(sum((X-mean(mean(X))).^2))/11  %把X中每个元素都看做一个变量的样本,求其方差的无偏估计值

ans =

    6.9697

>>  sum(sum((X-mean(mean(X))).*(Y-mean(mean(Y)))))/11  %把X、Y矩阵对应位置元素看做一个联合样本,根据公式E[(X-EX)*(Y-EY)]求协方差

ans =

    4.4242

.....................................................................................

cov(X,1)  和  cov(X,Y,1) 与之前的求解过程一致,不同的是,其求出的是协方差,而不是样本的协方差无偏估计值,即其除以的是N 而不是N-1

例3:

>> cov(X,1)

ans =

    1.6875   -0.5625    0.3750
   -0.5625    3.6875   -5.3750
    0.3750   -5.3750    8.2500

>> x=X(:,1);
sum((x-3.25).^2)/4  %不同之处

ans =

    1.6875

>>  y = X (:,2);
>> y = y - 4.25;
>> aa = x'*y/4  %不同之处

aa =

   -0.5625

例4:


X =

     1     5     6
     4     3     9
     4     2     9
     4     7     2
>> Y = [1 6 7; 7 5 9 ; 1 6 4 ; 2 9 2]

Y =

     1     6     7
     7     5     9
     1     6     4
     2     9     2

>> cov(X,Y)

ans =

    6.9697    4.4242
    4.4242    8.4470

>> a =cov(X,Y,1)

a =

    6.3889    4.0556
    4.0556    7.7431

>> a.*12/11              %看出来了吧

ans =

    6.9697    4.4242
    4.4242    8.4470