异常数据过滤算法MATLAB

文章介绍了几种常见的异常值检测方法,包括基于正态分布的莱因达准则、极差比法(狄克逊准则)、格鲁布斯法,以及适用于非平稳数据的滑弧法。这些方法在数据预处理中用于识别和剔除异常数据,确保后续分析的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(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

在Python中,对数据进行预处理并应用R平方准则(也称为莱恩克龙德准则,R-squared criterion,主要用于评估模型拟合程度)来剔除异常值通常涉及以下几个步骤: 1. **导入库**: 首先需要导入必要的数据分析和统计库,如`pandas`, `numpy` 和 `scipy.stats`。 ```python import pandas as pd import numpy as np from scipy import stats ``` 2. **加载数据**: 加载数据集,假设它是一个CSV文件或者DataFrame。 ```python data = pd.read_csv('your_data.csv') ``` 3. **计算R方**: 对于每个特征,计算其残差平方和(Residual Sum of Squares, RSS)以及总平方和(Total Sum of Squares, TSS),然后计算R方,这是异常值检测的一个间接指标。如果R方接近0,说明该数据点与整体趋势不符。 ```python def calculate_r_squared(data): y = data['target_column'] X = data.drop('target_column', axis=1) residual_sum_of_squares = ((y - np.mean(y)) ** 2).sum() total_sum_of_squares = ((y - np.mean(y)).mean() ** 2) * len(y) r_squared = 1 - (residual_sum_of_squares / total_sum_of_squares) return r_squared r_squared_values = data.apply(calculate_r_squared, axis=0) ``` 4. **确定阈值**: 确定一个合理的R方阈值,比如0.75或0.8,低于这个阈值的数据点被视为异常值。 ```python threshold = 0.7 outliers = r_squared_values[r_squared_values < threshold].index.tolist() ``` 5. **删除异常值**: 根据R方结果,从原始数据中移除这些异常值。 ```python cleaned_data = data.drop(outliers, axis=0) ``` 6. **验证处理**: 可能还需要进一步分析清洗后的数据,确保没有过度剔除了正常数据
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值