目录
摘要:为了消除奇异值对系统模型辨识的影响, 并提高时间序列数据预处理的效果, 提出一种基于统计分析的奇异值检测方法. 该方法将时间序列信号变化特征与统计学理论相结合, 在计算时间序列信号的变化速率的基础上,对其进行统计分析, 进而得到异常值发生的位置, 并利用内插法对原始的观察信号进行修复. 应用结果表明: 该算法简单、有效、计算量小, 能满足时间序列数据预处理的需求。
Ⅰ. 问题描述
Ⅱ. 异常值检测算法
Ⅲ. 数值仿真与实验分析
图1(a) 原始信号的观察值
图1(b) 信号变化率的直方图
图1(c) 本文算法的应用效果
图1(d)传统6xsigma控制剧的应用效果
★★★源代码
clc
clear all
close all
x=linspace(0,1,100);
a=zeros(1,100);
b=fix(rand(1,3)*100);%随机产生异常点的位置
a(b)=[0.5 -0.5 0.5];
y=sin(2*pi*x).^2+sqrt(0.0005)*randn(1,100)+a;
[m,n]=size(y);
Delta=zeros(m-1,1);
for j=1:n-1
Delta(j)=y(j+1)-y(j);
end
miu=sum(Delta)/(n-1); %变化率均值
sigma=sqrt(sum((Delta-miu).^2)/(n-1)); %变化率方差
n=2;%可为1 2 3
a=abs(Delta-miu)>n*sigma;
[mm1,nn1]=find(a==1);
[mm2,nn2]=find(a==0);
figure(1)
plot(y,'b')
hold on
plot(nn1,y(nn1),'ro');%%判别出来的异常数据
xticks([0:20:100]);
xticklabels({'0','.2','0.4','0.6','0.8','1'});
%频率图
figure(2)
hist(Delta)
%% 本文方法
y_b=spline(nn2,y(nn2),nn1);%%插值
y_new=y;
for i=1:size(y_b')
y_new(nn1(i))=y_b(i);
end
figure(3)
plot(y_new,'b');%绘制新数列
xticks([0:20:100]);
xticklabels({'0','.2','0.4','0.6','0.8','1'});
%% 老方法
pingjun=sum(y)/size(y,2); %原始数据均值
fangcha=sqrt(sum((y-pingjun).^2)/size(y,2)); %原始数据方差
figure(4)
plot(y,'b')
hold on
plot([0 100],[pingjun pingjun],'g')
hold on
plot([0 100],[pingjun+3*fangcha pingjun+3*fangcha],'r--')
hold on
plot([0 100],[pingjun-3*fangcha pingjun-3*fangcha],'r--')
xticks([0:20:100]);
xticklabels({'0','.2','0.4','0.6','0.8','1'});
legend('原始信号','中心线','上下线','Location','north','NumColumns',3,'box','off')
Ⅳ.结论
过数值仿真和应用验证, 该方法在动态控制过程时间序列异常值检测方面具有较高的检测准确度, 为改善和提高时间序列的原始数据质量、降低错误数据干扰提出了一种比较实用的方法。
Ⅴ.参考文献
[1]陈娇,潘天红,张明.基于信号变化速率的时间序列异常值检测方法[J].北京工业大学学报,2014,40(07):992-995.
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。