用matlab如何计算协方差矩阵?求高手指点
书上说协方差的公式是c(i,j)=E{[X(i,:)-E(X(i,:))]*[X(j,:)-E(X(j,:))]};
E是求期望值。
已知 X = [-1 1 2 ; -2 3 1 ; 4 0 3];
用matlab函数计算:
c=cov(X)得:
c= 10.3333 -4.1667 3.0000
-4.1667 2.3333 -1.5000
3.0000 -1.5000 1.0000
而我自己按公式编程:
a = [-1 1 2 ; -2 3 1 ; 4 0 3]
cov(a);
for i=1:size(a,2)
for j=1:size(a,2)
c(i,j)=mean((a(i,:)-mean(a(i,:))).*(a(j,:)-mean(a(j,:))));
end
end
c
得到的答案确是:
c= 1.5556 1.8889 -0.8889
1.8889 4.2222 -3.2222
-0.8889 -3.2222 2.8889
谁能告诉我为什么2次算得的答案不同??错在哪里?
[解决办法]
[n,p] = size(X);
X = X - ones(n,1) * mean(X);
Y = X '*X/(n-1);
参考一下这个算法
Y为X的协方差