)就是,方差公式中分母上是N,而样本方差无偏估计公式中分母上是N-1 (N为样本个数)。
OK!正题!
函数名称: var
函数功能:求解方差
函数用法:var(X) %与var(X,0)相同
var(X,W)
var(X,W,dim)
注:var(X,W) %
W可以取0或1,取0求样本方差的无偏估计值(除以N-1;对应取1求得的是方差(除以N),
W也可以是向量,但必须与X中的第一个维度数相同,即length(W)= size(X,1)
所以还存在: var(X ,0 ,dim) % 除以N dim =1 对每列操作
dim = 2 对每行操作
var(X ,1
,dim) % 除以N-1 dim =1 对每列操作
dim = 2 对每行操作
var(X,W,dim)
%
关于W取向量时,把W看做X中观察值发生的次数(或者说概率也行)
下面详细介绍秘籍:
.........................................................
对于X是向量时,把向量中每个元素看做一个样本
var(X)或者var(X,0)函数输出这个向量中元素的样本方差的无偏估计值,var(X,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
............................................................
对于X是矩阵时
把每行看做一个观察值,每列看做一个变量,函数输出一个行向量,每个元素计算的是该列的方差
例2:
>> 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.0000
3.5556
1.5556
>> (sum((X-repmat(mean(X),3,1)).^2))/(size(X,1))
%验证
ans =
6.0000
3.5556
1.5556
——————————————————————————————
对于var(X ,0 ,dim) 或者 var(X ,1 ,dim) 前面已说 0 对应 除以N-1; 1对应除以N;
dim 指维度信息,默认为1,dim =1 就指对每列操作; dim =2 就指对每行操作。
下面以 var(X ,0 ,dim) 为例进行试验验证:
参考结果:默认为1情况↑(往上看)
>> var(X ,0 ,2)
ans =
8.3333
2.3333
7.0000
>> Y = X';
>> var(Y)
ans =
8.3333
2.3333
7.0000
(一样吧)
...............................................................
对于 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);
% w 看做是x中每个观察值的出现次数,这样w ./
sum(w)即使每个观察样本出现的概率,
x0 = bsxfun(@times, w, x);
%根据这个概率权重求出期望值或者平均值sum(x0,
dim)
x = bsxfun(@minus, x, sum(x0, dim));
%where now RESID is computed using
a weighted mean. 这儿就是那个RESID
y = sum(bsxfun(@times, w, abs(x).^2), dim);
逐行验证:
>> clear
>> x= [1 6 6;4 2 5;7 2 3]
x =
1
6
6
4
2
5
7
2
3
>> w = [1 2 3];
>> dim = 1 ;
>> n = size(x ,dim)
n =
3
>> wresize = ones(1,max(ndims(x),dim))
wresize =
1
1
>> wresize(dim) = n
wresize =
3
1
>> w = reshape(w ./ sum(w), wresize)
w =
0.1667
0.3333
0.5000
>> x0 = bsxfun(@times, w, x)
x0 =
0.1667
1.0000
1.0000
1.3333
0.6667
1.6667
3.5000
1.0000
1.5000
>> x = bsxfun(@minus, x, sum(x0, dim));
>>
y = sum(bsxfun(@times, w, abs(x).^2), dim)
y =
5.0000
2.2222
1.4722
>> var (x,w)
%验证下成果
ans =
5.0000
2.2222
1.4722
你要是还感觉晕的话(

),下面以第一列为例说明W作用
>> X= [1 6 6;4 2 5;7 2 3];
>> a = X(:,1);
%取出第一列
>> b = w ./ sum(w);
%求出概率矩阵
>> a0=a.*b;
>> a1=sum(a0);
%求出第一列在W概率加权下的平均值
>> a2=a -a1;
>> c = w.*(a2.^2)
%W看做是每个观察值的出现次数,求出在此加权下的方差
>> sum(c)
ans =
5
注意: 需要注意的是,这种情况下求出的是样本的统计方差(也就是除以N的那种,因为式中w ./
sum(w)),并非样本方差无偏估计值
当然对于var(X,W,dim)中dim=1(对每列求方差)dim=2(对每行求方差)也可以进行验证,由于方式基本与之前的相同,在此不再赘述
二师兄,快到了!
↘
↘
↘
↘
↘
↘
................................................................................