资源描述
用格拉布斯准则判断异常数据
精品资料
用格拉布斯准则判断异常数据
一、实验目的
1.通过实验加深对格拉布斯准则的理解。
2.掌握实验中异常数据的处理方法。
二、实验要求
用C语言或其它高级语言编写一程序,输入一组测量数据(9~15个,程序可设定),根据格拉布斯准则判断有无异常数据。如有,则剔除异常数据并重新计算,直到无异常数据为止。具体要求如下:
1. 数据个数可输入;
2. 格拉布斯系数g以表的形式存于数组中;
3. 显示均值、标准偏差等中间结果、被剔除的异常数据、显示无异常数据的测量数据等。
三、实验原理
在无系统误差的情况下,测量中大误差出现的概率是很小的。在正态分布下,误差绝对值超过2.57的概率仅为1%,误差绝对值超过3的概率仅为0.27%≈1/370。对于误差绝对值较大的测量数据,就值得怀疑,可以列为可疑数据。可疑数据对测量值的平均值及实验标准偏差都有较大的影响,造成测量结果的不正确,因此在这种情况下要分清可疑数据是由于测量仪器、测量方法或人为错误等因素造成的异常数据,还是由于正常的大误差出现的可能性。首先,要对测时过程进行分析,是否有外界干扰,如电力网电压的突然跳动,是否有人为错误,如小数点读错等。其次,可以在等精度条件下增加测量次数,以减少个别离散数据对最终统计估值的影响。
在不明原因的情况下,就应该根据统计学的方法来判别可疑数据是否是粗差。这种方法的基本思想是:给定一置信概率,确定相应的置信区间,凡超过置信区间的误差就认为是粗差,并予以剔除。用于粗差剔除的常见方法有莱特检验方法和格拉布斯检验方法。
1. 莱特检验方法
莱特检验法是一种正态分布情况下判别异常值的方法。判别方法如下:
假设在一列等精度测量结果中,第i项测量值xi所对应的残差vi的绝对值,则该误差为粗差,所对应的测量值xi为异常数值,应剔除不用。
此处,残差,标准偏差估计(贝塞尔公式),均值。
本检验方法简单,使用方便,当测量次数n较大时,是比较好的方法。一般适用于n>10的情况,n<10时,莱特检验法失去判别能力。
2. 格拉布斯检验法
格拉布斯检验法是在未知总体标准偏差的情况下,对正态样本或接近正态样本异常值进行判别的一种方法,是一种从理论上就很严密,概率意义明确,以经实验证明效果较好的判据。具体方法如下:对一系列重复测量中的最大或最小数据,用格拉布斯检验法检验,若残差,则判断此值为异常数据,应予以剔除。g值按重复测量次数及置信概率由表2-1给出。
表2-1 格拉布斯检验法g值
1-pc n
3
4
5
6
7
8
9
10
11
12
5%
1.15
1.46
1.67
1.82
1.94
2.03
2.11
2.18
2.23
2.29
1%
1.15
1.49
1.75
1.94
2.10
2.22
2.32
2.41
2.48
2.55
1-pc n
13
14
15
16
17
18
19
20
5%
2.33
2.37
2.41
2.44
2.47
2.50
2.53
2.56
1%
2.61
2.66
2.70
2.74
2.78
2.82
2.85
2.85
四、可供选择的仪器与设备
1. 微机 一台
2. C语言集成开发环境或其它高级语言开发环境
五、实验预习要求
熟悉有关异常数据处理的的基本知识,掌握格拉布斯检验法检验异常数据的基本方法。
六、实验报告要求
1. 简述实验目的、原理、方法、步骤。
2. 列出全部实验数据,记录实验结果(计算机屏幕显示内容)。
3. 画出程序流程图。
七、思考题
1. 本实验中,为什么n<10时,莱特检验法失去判别能力?而格拉布斯检验法却可以?
实验程序:
# include<stdio.h>
# include<math.h>
void main()
{
int i,n,j=1;
float a[200],b[200],v[200],v.a[200],aver,suma,sumb,c,d,daver,n.a,;
printf(“enter array a:\n”);
for(i=1;i<=n;i++)
scanf(“%f,%d”,&a[i],n);
printf(“\n”);
suma=a[1];
for(i=2;i<=n;i++)
{
suma=suma+a[i];
aver=suma/n;
}
printf(“average is %f\n”,aver);
for(i=1;i<=n;i++)
{
b[i]=a[i]*a[i];
sumb=sumb+b[i];
}
c=sumb/(n-1);
d=float sqrt (float c);
n.a=float sqrt(float d);
daver=d/n.a;
daver=daver*3;
for(i=1;i<=n;i++)
{
v[i]=a[i]-aver;
v.a[i]=float fabs(fabs v[i]);
if(v.a[i]>daver)
printf(“%f”,&a[i]);
else
c[j]=&a[i];
j++;
printf()
printf ( “%f”,&c[j]);
}
}
仅供学习与交流,如有侵权请联系网站删除 谢谢5
展开阅读全文