异常数据过滤算法MATLAB

(1)莱茵达准则

莱因达准则又称3sigma准则:本方法适合样本数据服从正态分布,且样本量不小于8。根据莱因达准则,当观测数据服从正态分布时,残差落在3倍标准差[-3,3]的概率超过99. 7%,落在此区域外的概率不超过0. 3%。因此,可以认为残差落于该区域外的测量数据为异常值。

算法步骤为:

①首先需要保证需要检验的数据列大致上服从正态分布;

②然后计算需要检验的数据列的标准差;

③最后比较数据列的每个值,是否大于标准差的3倍;

④大于3倍标准差的删除该样本。

function [data_new] = ryan_filter(data)
% Ryan filter for outlier detection
% data: input data
% data_new: output data after filtering
mu = mean(data(:,2));
sigma = std(data(:,2));
data_new = data(abs(data(:,2) - mu) <= 3*sigma,:);
end

(2)极差比法

极差比法也叫狄克逊(Dixon)准则:以极差比为统计量来判定和剔除异常数据。该准则采用极差比的方法,可得到简化而严密的结果,从而避免了需先求出样本标准差的麻烦。本方法适合静态数据,且样本数据服从正态分布。

function [data_new] = range_filter(data)
% Range filter for outlier detection
% data: input data
% data_new: output data after filtering

r = range(data(:,2));
q1 = prctile(data(:,2), 25);
q3 = prctile(data(:,2), 75);
iqr = q3 - q1;
data_new = data(abs(data(:,2) - median(data(:,2)),:) <= 3*r/iqr);
end

(3)格鲁布斯法

格鲁布斯法适合样本数据服从正态分布,且样本量不小于3。

function [data_new] = grubbs_filter(x,alpha)
flag_1=1;
flag_2=0;
%% 计算 
while flag_1==1
sortrows(x,2);
n=size(x,1);
avg=mean(x(:,2));
st=std(x(:,2),1); 
reg=abs((x(:,2)-avg)./st);
reg_max=max(reg);
%% 确定g值 
T=[0 0 1.153 1.463 1.672 1.822 1.938 2.032 2.11 2.176 2.234 2.285 2.331 2.371 2.409 2.443 2.475 2.501 2.532 2.557 2.58 2.603 2.624 2.644 2.663 2.681 2.698 2.714 2.73 2.745 2.759 2.773 2.786 2.799 2.811 2.823 2.835 2.846 2.857 2.866 2.877 2.887 2.896 2.905 2.914 2.923 2.931 2.940 2.948 2.956 2.943 2.971 21978 2986 2.992 3.000 3.006 3.013 3.019 3.025 3.032 3.037 3.044 3.049 3.055 3.061 3.066 3.071 3.076 3.082 3.087 3.092 3.098 3.102 3.107 3.111 3.117 3.121 3.125 3.130 3.134 3.139 3.143 3.147 3.151 3.155 3.160 3.163 3.167 3.171 3.174 3.179 3.182 3.186 3.189 3.193 3.196 3.201 3.204 3.207; 
0 0 1.155 1.492 1.749 1.944 2.097 2.22 2.323 2.41 2.485 2.55 2.607 2.659 2.705 2.747 2.785 2.821 2.954 2.884 2.912 2.939 2.963 2.987 3.009 3.029 3.049 3.068 3.085 3.103 3.119 3.135 3.150 3.164 3.178 3.191 3.204 3.216 3.228 3.240 3.251 3.261 3.271 3.282 3.292 3.302 3.310 3.319 3.329 3.336 3.345 3.353 3.361 3.388 3.376 3.383 3.391 3.397 3.405 3.411 3.418 3.424 3.430 3.437 3.442 3.449 3.454 3.460 3.466 3.471 3.476 3.482 3.487 3.492 3.496 3.502 3.507 3.511 3.516 3.521 3.525 3.529 3.534 3.539 3.543 3.547 3.551 3.555 3.559 3.563 3.567 3.570 3.575 3.579 3.582 3.586 3.589 3.593 3.597 3.600];
switch alpha
case 0.05 
g=T(1,n);
case 0.01 
g=T(2,n);
otherwise 
disp('输入了错误的alpha值');
end % 比较确定异常值?
if reg_max>g 
flag_2=1;
abn=x(reg>g);
disp('被剔除的数据为')
disp(abn);
x=x(reg<=g,:);
else
    flag_1=0;
end
end
if flag_2==0 
disp('没有异常数据');
end
data_new = x;
end

(4)滑弧法

滑弧法:当采样数据不满足平稳性正态性要求时,可基于状态方程并采用卡尔曼滤波、分割递推算法或最大似然法来识别和剔除异常值,但这些算法比较复杂。更简单的方式是采用滑弧算式,滑弧算式不对数据进行分段。本方法适用于动态数据。

function [data_new] = hh_filter(data,w)
sortrows(data,1);
temp = data(:,2);
temp_new= filloutliers(temp,'spline','movmedian',w); 
data(:,2) = temp_new;
data_new = data;
end

你可能感兴趣的:(matlab,算法)