废话不多说,这节都是干货
我们继续讲第二个函数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
..............................................................................
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
额,二师兄,到高老庄了