协方差矩阵
协方差也只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算n!(n−2)!∗2个协方差,那自然而然我们会想到使用矩阵来组织这些数据。给出协方差矩阵的定义:
Cn∗n=(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
计算的结果,和之前的数据填入矩阵后的结果完全相同。