Matlab笔记——数据预处理 ——剔除异常值及平滑处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

012. 数据预处理(1)——剔除异常值及平滑处理测量数据在其采集与传输过程中,由于环境干扰或人为因素有可能造成个别数据不切合实际或丢失,这种数据称为异常值。为了恢复数据的客观真实性以便将来得到更好的分析结果,有必要先对原始数据(1)剔除异常值;

另外,无论是人工观测的数据还是由数据采集系统获取的数据,都不可避免叠加上“噪声”干扰(反映在曲线图形上就是一些“毛刺和尖峰”)。为了提高数据的质量,必须对数据进行(2)平滑处理(去噪声干扰);

(一)剔除异常值。

注:若是有空缺值,或导入Matlab数据显示为“NaN”(非数),需要①忽略整条空缺值数据,或者②填上空缺值。

填空缺值的方法,通常有两种:A. 使用样本平均值填充;B. 使用判定树或贝叶斯分类等方法推导最可能的值填充(略)。

一、基本思想:

规定一个置信水平,确定一个置信限度,凡是超过该限度的误差,就认为它是异常值,从而予以剔除。

二、常用方法:拉依达方法、肖维勒方法、一阶差分法。

注意:这些方法都是假设数据依正态分布为前提的。

1. 拉依达方法(非等置信概率)

如果某测量值与平均值之差大于标准偏差的三倍,则予以剔除。

3x i x x S ->

其中,11n

i

i x x n ==∑为样本均值,1

2

2

11()1n

x i i S x x n =⎛⎫ ⎪⎝⎭

=--∑为样本的标准偏差。

注:适合大样本数据,建议测量次数≥50次。

代码实例(略)。

2. 肖维勒方法(等置信概率)

在 n 次测量结果中,如果某误差可能出现的次数小于半次时,就予以剔除。

这实质上是规定了置信概率为1-1/2n ,根据这一置信概率,可计算出肖维勒系数,也可从表中查出,当要求不很严格时,还可按下列近似公式计算:

10.4ln()n n ω=+

Tab1. 肖维勒系数表

如果某测量值与平均值之差的绝对值大于标准偏差与肖维勒系数之积,则该测量值被剔除。

n x i x x S ω->

例1. 利用肖维勒方法对下列数据的异常值()进行剔除: 上述数据保存于文件

代码:

x=load(''); n=length(x); subplot(2,1,1); plot(x,'o'); title('原始数据')

axis([0,n+1,min(x)-1,max(x)+1]); w=1+*log(n);

yichang = abs(x-mean(x)) > w*std(x);

% 若用拉依达方法,把w 改成3即可,但本组数据将不能成功剔除异常值。 x(yichang)=[]; save x -ASCII subplot(2,1,2); plot(x,'rs');

title('异常值剔除后数据');

axis([0,n+1,min(x)-1,max(x)+1]);

运行结果:x =

y =

3. 一阶差分法(预估比较法)

用前两个测量值来预估新的测量值,然后用预估值与实际测量值比较,若大于事先给定的允许差限值,则剔除该测量值。

预估值

112()ˆn n n n x

x x x ---+-=

比较判别:

ˆn n x x

W -< 注:该方法的特点是

(1)适合于实时数据采集与处理过程;

(2)精度除了与允许误差限的大小有关外,还与前两点测量值的精确度有关;

(3)若被测物理量的变化规律不是单调递增或单调递减函数,这一方法将在函数的拐点处产生较大的误差,严重时将无法使用。

(二)数据的平滑处理

对于一组测量数据(xi ,yi ) i=1,…,n ,不要直接就想着求出的拟合多项式的线性参数,而是要先平滑处理去掉“噪声”。平滑处理在科学研究中广泛使用,它可以减少测量中统计误差带来的影响,尤其被用于无法利用多次重复测量来得到其平均值的情况和当yi 随xi 有徒然变化的那些测量段。

1. “(2n+1点)单纯移动平均”平滑滤波

取出以yi 为中心的前后各n 个数据(yi-n, …,yi-1,yi,…yi+n )求平均值代替yi ,即

'

1121n

i i k n

y y n +=-=+∑ 优点:方法简单,计算方便。

缺点:方法产生误差会造成信号失真;前后各n个数据无法平滑。

适用性:适用于变化缓慢的数据。

注:n越大平滑效果越好,但失真也越大。

例2.“9点单纯移动平均”平滑滤波

代码:

% 建立“n点单纯移动平均”的滤波函数

% 注意函数要单独保存为与函数名同名的.m文件

function Y=smooth_data(y,n)

m=length(y);

j=1;

for i=(n-1)/2+1:(m-(n-1)/2)

p=i-(n-1)/2;

q=i+(n-1)/2;

Y(j)=sum(y(p:q))/n;

j=j+1;

end

end

% 主程序

clc

clear

t=-15::15;

n=length(t);

Y=5./(1+t.^2); % 原始测试数据

y=Y+(1,n)); % 给测试数据加上噪声干扰

y1=smooth_data(y,9); % 调用函数作9点滤波处理

plot(1:n,Y,1:n,y,'-o',5:n-4,y1,'-*');

legend('无噪声','含噪声','9点平滑后');

运行结果:

相关文档
最新文档