matlab自动识别粗大误差,剔除粗大误差
一、拉依达法当试验次数较多时,可简单地用3倍标准偏差(3S)作为确定可疑数据取舍的标准。当某一测量数据(xi)与其测量结果的算术平均值(x-‘)之差大于3倍标准偏差时,用公式表示为:?xi -x-‘?>3S则该测量数据应舍弃。这是美国混凝土标准中所采用的方法,由于该方法是以3倍标准偏差作为判别标准,所以亦称3倍标准偏差法,简称3S法。取3S的理由是:根据随机变量的正态分布规律,在多次试验中,测量值
一、拉依达法
当试验次数较多时,可简单地用3倍标准偏差(3S)作为确定可疑数据取舍的标准。当某一测量数据(xi)与其测量结果的算术平均值(x-‘)之差大于3倍标准偏差时,用公式表示为:
?xi -x-‘?>3S
则该测量数据应舍弃。
这是美国混凝土标准中所采用的方法,由于该方法是以3倍标准偏差作为判别标准,所以亦称3倍标准偏差法,简称3S法。
取3S的理由是:根据随机变量的正态分布规律,在多次试验中,测量值落在 x-‘一3S与x-‘ 十3S之间的概率为99.73%,出现在此范围之外的概率仅为0.27%,也就是在近400次试验中才能遇到一次,这种事件为小概率事件,出现的可能性很小,几乎是不可能。因而在实际试验中,一旦出现,就认为该测量数据是不可靠的,应将其舍弃。
另外,当测量值与平均值之差大于2倍标准偏差(即 ?xi -x-‘?> 2S)时,则该测量值应保留,但需存疑。如发现生产(施工)、试验过程屯有可疑的变异时,该测量值则应予舍弃。
拉依达法简单方便,不需查表,但要求较宽,当试验检测次数较多或要求不高时可以应用,当试验检测次数较少时(如n<10)在一组测量值中即使混有异常值,也无法舍弃。
二、肖维纳特法
进行n次试验,其测量值服从正态分布,以概率1/(2n)设定一判别范围(一knS,knS),当偏差(测量值xi与其算术平均值x-‘之差)超出该范围时,就意味着该测量值xi是可疑的,应予舍弃。判别范围由下式确定:
肖维纳特法可疑数据舍弃的标准为:
?xi一 x-‘?/S≥kn
三、格拉布斯法
格拉布斯法假定测量结果服从正态分布,根据顺序统计量来确定可疑数据的取舍。
进行n次重复试验,试验结果为x1、x2、…、xi、…、xn ,而且xi服从正态分布。
为了检验 (i=1,2,…,n)中是否有可疑值,可将 按其值由小到大顺序重新排列,根据顺序统计原则,给出标准化顺序统计量g:
当最小值x(1)可疑时,则: g=( x-‘一x(1) )/S
当最大值x(n)可疑时,则: g=( x(n) 一 x-‘ )/S
根据格拉布斯统计量的分布,在指定的显著性水平β(一般β=0.05)下,求得判别可疑值的临界值g0( β,n) ,格拉布斯法的判别标准为:
g≥g0( β,n)
利用格拉布斯法每次只能舍弃一个可疑值,若有两个以上的可疑数据,应该一个一个数据的舍弃,舍弃第一个数据后,试验次数由n变为n一1,以此为基础再判别第二个可疑数据。
2007-5-14 04:33 #2
yutx121
工程师
if mod(rownum2,2)
F1=lcol(round((rownum2+1)/2));
F0=ucol(round((rownum2+1)/2));
else
F1=(lcol(round(rownum2/2+1))+lcol(round(rownum2/2)))/2;
F0=(ucol(round(rownum2/2+1))+ucol(round(rownum2/2)))/2;
end
end
dF=F0-F1; % 四分位数离散度
beta=2; % 精度常数
ruo1=F1-beta/2*dF;
ruo2=F0+beta/2*dF;
outerindex=find(Dataruo2);
outercoor=Data(outerindex);
outers{k,1}=outerindex;
outers{k,2}=outercoor;
end
%-------------------------------------------------------------------------------
function outers = laYiDa(originData)
% laYiDa,m
% 采用拉依达法剔除粗大误差点
% 输出参数为cell矩阵
% 2004.5
[m,n]=size(originData);
outers=cell(n,2);
for k=1:n
colData=originData(:,k);
outercoor=findouter(colData); % 找出列的outer
outerindex=[];
outercoor2=[];
for num=1:length(outercoor)
tempcoor=outercoor(num);
tempindex=find(abs(colData-tempcoor)<0.1);
tempcoor=tempcoor*ones(length(tempindex),1); % 避免出现相同值的情况露选
outerindex=[outerindex;tempindex];
outercoor2 =[outercoor2;tempcoor];
end
outers{k,1}=outerindex;
outers{k,2}=outercoor2;
end
%-------------------------------------------------------------------------------
function coor=findouter(colset)
%采用递归的方法剔除outer
colStd = std(colset);
colMean = mean(colset);
colSub = abs(colset-colMean);
index=find(colSub>(2.8*colStd));
coor=colset(index);
if(isempty(index))
return;
else
colset(index)=[];
tempcoor=findouter(colset);
coor=[coor;tempcoor];
end
上面的代码因为当时是同时对多列进行处理的,你不需要如此,也就应该少一层循环的;
并且上面是直接剔除粗大误差点,与你要采用插值代替不一样的,你自己得适当注意
整个程序应该不会太复杂的
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)