本文是学习多篇博客总结而得:
numpy中var和cov函数求法和MATLAB中var和cov函数求法类似:
首先均值X,样本方差S,样本协方差C 公式分别为:
一. MATLAB和Python中计算样本方差的函数都是var,但是二者有区别:
(参考:http://blog.sciencenet.cn/blog-412206-612018.html)
在MATLAB中,计算方差采用的公式为:
该公式计算出的结果为总体方差 σ2
在Python中,对var计算时采用的公式为:
即样本的二阶中心矩;只有使用参数ddof = 1时才计算样本方差,计算结果才与MATLAB的var公式计算结果相同。
二. matlab 统计基本函数 var方差
(参考:http://blog.csdn.net/tong_huijiao/article/details/54018019)
matlab中的方差函数var的用法及具体分析:
首先我们应该清楚的区分两个概念,即方差和样本方差的无偏估计:
方差公式中分母上是N;
样本方差无偏估计公式中分母上是N-1 (N为样本个数)。
函数名称: var
函数功能:求解方差
函数用法:var(X) %与var(X,0)相同
var(X,W)
var(X,W,dim)
注:var(X,W)
% 1. W可以取0或1,取0求样本方差的无偏估计值(除以N-1;对应取1求得的是方差(除以N),
% 2. W也可以是向量,但必须与X中的第一个维度数相同,即length(W)= size(X,1)
var(X ,0 ,dim) % 除以N-1 ;dim =1 对每列操作 dim = 2 对每行操作
var(X ,1 ,dim) % 除以N; dim =1 对每列操作 dim = 2 对每行操作
var(X,W,dim) % 关于W取向量时,把W看做X中观察值发生的次数(或者说概率也行)
…………………………………………………
2.1. 对于X是向量时,把向量中每个元素看做一个样本
var(X)或者var(X,0)函数输出这个向量中元素的样本方差的无偏估计值
var(X , 1)输出的是样本方差
例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
2.2. 对于X是矩阵时
把每行看做一个观察值,每列看做一个变量,函数输出一个行向量,每个元素计算的是该列的方差
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.00
2.3. 对于var(X ,0 ,dim) 或者 var(X ,1 ,dim) 前面已说 0 对应 除以N-1; 1对应除以N;
dim 指维度信息,默认为1,dim =1 就指对每列操作; dim =2 就指对每行操作。
下面以 var(X ,0 ,dim) 为例进行试验验证:
参考结果:默认dim=1
var(X ,0 ,2)
ans =
8.3333
2.3333
7.0000
Y = X’;
var(Y)
ans =
8.3333 2.3333 7.0000 (一样吧)
2.4 . 对于 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);
三. MATLAB中cov函数的用法
(参考:http://blog.sina.com.cn/s/blog_9e67285801010twv.html)
函数名称: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
详细描述:
......................................................................
3.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
..............................................................................
3.2 X是一个矩阵来说,matlab把每行看做一个观察值,把每列当做一个变量.
也就是说对于一个4*3的矩阵求协方差矩阵,matlab会认为存在三个变量,即会求出一个3*3的协方差矩阵。
其中,对角线元素为对应变量的方差无偏估计值,其他位置为对应变量间的 协方差无偏估计值(即除的是N-1)
.......................................................................
例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
aa =
-0.7500
......................................................
3.3 对于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
.....................................................................................
3.4 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