协方差&协方差矩阵【matlab实例】

协方差矩阵

协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算 n!(n2)!2 个协方差,那自然而然我们会想到使用矩阵来组织这些数据。给出协方差矩阵的定义:

Cnn=(ci,j,ci,j=cov(Dimi,Dimj))

这个定义还是很容易理解的,我们可以举一个三维的例子,假设数据集有三个维度,则协方差矩阵为:


这里写图片描述

必须要明确一点,协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。以下的演示将使用Matlab,为了说明计算原理,不直接调用Matlab的cov函数:

首先,随机生成一个10*3维的整数矩阵作为样本集,10为样本的个数,3为样本的维数。

>> mySample=fix(rand(10,3)*50)

mySample =

    40     7    32
    45    48     1
     6    47    42
    45    24    46
    31    40    33
     4     7    37
    13    21    37
    27    45    19
    47    39    32
    48    47     8

根据公式,计算协方差需要计算均值,前面特别强调了,协方差矩阵是计算不同维度之间的协方差,要时刻牢记这一点。样本矩阵的每行是一个样本,每列是一个维度,因此我们要按列计算均值。为了描述方便,我们先将三个维度的数据分别赋值:


>> dim1=mySample(:,1)

dim1 =

    40
    45
     6
    45
    31
     4
    13
    27
    47
    48

>> dim2=mySample(:,2)

dim2 =

     7
    48
    47
    24
    40
     7
    21
    45
    39
    47

>> dim3=mySample(:,3)

dim3 =

    32
     1
    42
    46
    33
    37
    37
    19
    32
     8

计算dim1与dim2,dim1与dim3,dim2与dim3的协方差:

>> cov12=sum((dim1-mean(dim1)).*(dim2-mean(dim2)))/(size(mySample,1)-1)

cov12 =

    78

>> cov13=sum((dim1-mean(dim1)).*(dim3-mean(dim3)))/(size(mySample,1)-1)

cov13 =

 -120.2444

>> cov13=sum((dim1-mean(dim1)).*(dim3-mean(dim3)))/(size(mySample,1)-1)

cov13 =

 -120.2444

>> cov13=sum((dim1-mean(dim1)).*(dim3-mean(dim3)))/(size(mySample,1)-1)

cov13 =

 -120.2444

>> cov23=sum((dim2-mean(dim2)).*(dim3-mean(dim3)))/(size(mySample,1)-1)

cov23 =

 -126.9444

协方差矩阵的对角线上的元素就是各个维度的方差,下面我们依次计算这些方差:

>> var1=std(dim1)^2

var1 =

  301.1556

>> var2=std(dim2)^2

var2 =

  268.9444

>> var3=std(dim3)^2

var3 =

  216.0111

这样,我们就得到了计算协方差矩阵所需要的所有数据,可以调用Matlab的cov函数直接得到协方差矩阵:

>> cov(mySample)

ans =

  301.1556   78.0000 -120.2444
   78.0000  268.9444 -126.9444
 -120.2444 -126.9444  216.0111

计算的结果,和之前的数据填入矩阵后的结果完全相同。

你可能感兴趣的:(Math)