抗差估计
抗差估计的原理
抗差估计是近代测量平差范畴,又名稳健估计(robust estimate),据杨院士说中科院系统喜欢称之为抗差估计,武大喜欢称之为稳健估计。我们的测量值是随机变量,符合正态分布的,如果出现粗差(gross error)的话,我们在应用最小二差或卡尔曼滤波的时候就会使结果偏离真实值(滤波发散)的现象。我们解决粗差或系统误差的时候,可以从两方面去理解,均值漂移或者方差膨胀,抗差估计属于方差膨胀模型,即均值不变,方差变化的现象。我们可以通过对出现粗差的观测值进行降权处理。
我比较懒,不想打公式,大家应该也看过类似的推导,其实公式跟最小二差一样的,变化的地方就是权阵,换成了等价权,那么影响等价权的又是等价权函数,常见的有huber、IGG III等,我推荐IGG III,代码好实现。
我们在实现的时候,这个权阵很重要,权阵也就是我们说的方差阵的逆,分为独立和非独立,即观测值之间是否相关,是否相关也影响着等价权函数的形式。举一个最简单的独立观测距离的例子吧
抗差估计的例子
我们假设对一段距离进行10次独立观测,10个观测值分别为:5.09、5.10、5.13、5.09、5.12、5.08、5.46、7.81、5.10、5.11(单位为m),数据是我随便编的。
从上面这段描述,我们可以知道测量个数n=10,必要观测m=1,多余观测为n-m=9。独立观测那么权阵就是对角线,先验权矩阵为单位对角阵。而且肉眼可见的是7.81这个观测值是粗差,5.46嘛不确定是不是。
抗差程序实现
matlab实现的
%% 功能3-抗差估计
% % 假设对一段长度进行观测,5.09 5.10 5.13 5.09 5.12 5.08 5.46 7.81 5.10 5.11
close all
clear all
clc
k0=1.0;k1=2.5;k=1.0;
B=ones(10,1);% 设计矩阵
l=[5.09 5.10 5.13 5.09 5.12 5.08 6.46 7.81 5.10 5.11]';
% P=diag(ones(10,1));% 先验权矩阵1,等价权
P=diag(1./l);% 先验权矩阵2,根据长度倒数定权
x_prev=0;
x0=5.10;% 赋初值
l=l-x0;
while(1)
W=B'*P*l;
N=B'*P*B;
x=inv(N)*W;% 待估参数向量
v=B*x-l;% 残差向量
sigma0=sqrt(v'*P*v/(10-1));% 单位权中误差
disp(['待估参数向量:',num2str(x),' 单位权中误差:',num2str(sigma0)]);
Q=inv(P);
Qvv=Q-B*inv(N)*B';
for i=1:10
v_=v(i)/(sigma0*sqrt(Qvv(i,i)));
if abs(v_)<=k0
k=1.0;
elseif abs(v_)>k1
k=1e-8;
else
k=(k0/abs(v_))*((k1-abs(v_))/(k1-k0))^2;
end
P(i,i)=P(i,i)*k;
end
if x_prev==0
x_prev=x;
continue;
elseif abs(x_prev-x)<0.01
break;
end
x_prev=x;
end
x=x0+x_prev;%求出的最后长度 初值+改正数
disp(['length is ',num2str(x)])
打印结果如下:
使用等价权结果是:
待估参数向量:0.309 单位权中误差:0.8512
待估参数向量:0.042222 单位权中误差:0.11331
待估参数向量:0.0025 单位权中误差:0.01472
待估参数向量:-0.00031553 单位权中误差:0.0084525
length is 5.1025
使用长度倒数定权结果是:
待估参数向量:0.2218 单位权中误差:0.31128
待估参数向量:0.03985 单位权中误差:0.048702
待估参数向量:0.0024523 单位权中误差:0.0065128
待估参数向量:-0.0003396 单位权中误差:0.0037381
length is 5.1025
图中第一行就是我们最小二乘的结果,10个结果中只有一个结果与最小二乘得出的值接近,很明显与我们测量的结果是不一致的,所以说有一个粗差存在就会对最小二乘的结果产生毁灭性。那么如果我们应用抗差估计的话,再经过3次迭代就得出了最后的结果和单位权中误差。
如果我对第七个值,做修改,即由5.46变成6.46。结果如下所示:
使用单位权结果是:
待估参数向量:0.409 单位权中误差:0.91426
待估参数向量:0.1257 单位权中误差:0.38585
待估参数向量:0.0025 单位权中误差:0.01472
待估参数向量:-0.00031551 单位权中误差:0.0084526
length is 5.1025
使用长度倒数定权结果是:
待估参数向量:0.2218 单位权中误差:0.31128
待估参数向量:0.03985 单位权中误差:0.048702
待估参数向量:0.0024523 单位权中误差:0.0065128
待估参数向量:-0.0003396 单位权中误差:0.0037381
length is 5.1025
结论
使用抗差估计确定提高了参数估值的准确性,另外不同的先验权矩阵在迭代过程中结果是不一致,对于本例中使用长度倒数来定权,无论是否应用最小二差,其结果都与真实值接近,单位权中误差也较小。
观测值相关的抗差估计
主要就是这三步迭代:
1、标准化残差,单位权中误差
2、方差放大因子
3、等价方差
欢迎交流啊~
更新于2020/11/10 14:20:00
在上述例子中,要使用标准化残差,此处感谢中测院的肖同学提醒,很久没看经典平差了,协方差阵传播公式还真忘记了,哈哈哈。
扩展:其实我们在gnss spp中,观测值之间也是不相关的,所以懂了吧,找到对应参数直接套用就行了。