MATLAB 剔除异常点

利用线性插值剔除离群点

A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
B = filloutliers(A,'linear'); % 使用线性插值替代异常点
plot(1:15,A,1:15,B,'o')
legend('Original Data','Interpolated Data')

Create a vector of data containing an outlier, and use linear interpolation to replace the outlier. Plot the original and filled data.

效果如图
蓝色线为原始数据, 红色圆圈是剔除异常点后的数据.
请添加图片描述
除了线性插值还可以用其他方式填充,只需要将B = filloutliers(A,‘linear’); 中的’linear’替换成对应的方式即可.

用于替换离群值的填充方法,指定为数值标量或下列值之一:

填充方法说明
数值标量使用指定的标量值进行填充
‘center’使用由 findmethod 决定的中心值进行填充
‘clip’对于比 findmethod 决定的下阈值还小的元素,用下阈值填充。对于比 findmethod 决定的上阈值还大的元素,用上阈值填充。
‘previous’使用上一个非离群值进行填充
‘next’使用下一个非离群值进行填充
‘nearest’使用最接近的非离群值进行填充
‘linear’使用相邻的非离群值的线性插值进行填充
‘spline’使用分段三次样条插值进行填充
‘pchip’使用保形分段三次样条插值进行填充

利用均值确定离群值

创建包含一个离群值的向量,并将离群值定义为与均值相差超过三倍标准差的点。将该离群值替换为最接近的非离群值元素,并绘制原始数据和插入后的数据。

A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
B = filloutliers(A,'nearest','mean');
plot(1:15,A,1:15,B,'o')
legend('Original Data','Interpolated Data')

效果如下:
请添加图片描述
检测离群值的方法,指定为以下方法之一:

方法说明
‘median’离群值定义为与中位数相差超过三倍换算 MAD 的元素。换算 MAD 定义为 c*median(abs(A-median(A))),其中 c=-1/(sqrt(2)*erfcinv(3/2))。
‘mean’离群值定义为与均值相差超过三倍标准差的元素。此方法比 ‘median’ 快,但没有它可靠。
‘quartiles’离群值定义为比上四分位数 (75%) 大 1.5 个四分位差以上或比下四分位数 (25%) 小 1.5 个四分位差以上的元素。当 A 中的数据不是正态分布时,此方法很有用。
‘grubbs’使用 Grubbs 检验检测离群值,并基于假设检验每次迭代删除一个离群值。此方法假设 A 中的数据呈正态分布。
‘gesd’使用广义极端 Student 偏差检验检测离群值。此迭代方法与 ‘grubbs’ 类似,但当有多个离群值互相遮盖时,此方法的执行效果更好。

利用移动窗口确定离群值

使用移动中位数,查找与时间向量对应的正弦波内的局部离群值。

创建包含一个局部离群值的数据向量。

x = -2*pi:0.1:2*pi;
A = sin(x);
A(47) = 0;

创建与 A 中的数据对应的时间向量。

t = datetime(2017,1,1,0,0,0) + hours(0:length(x)-1);

将离群值定义为移动窗口内与局部中位数相差超过三倍局部换算 MAD 的点。在 A 中查找与 t 中的点对应的离群值的位置,窗口大小为 5 小时。使用方法 ‘clip’ 用计算的阈值填充离群值,并绘制原始数据和填充后的数据。

[B,TF,U,L,C] = filloutliers(A,'clip','movmedian',hours(5),'SamplePoints',t);
plot(t,A,t,B,'o')
legend('Original Data','Filled Data')

显示替换离群值的阈值。

L(TF)
ans = -0.8779

效果如下:
请添加图片描述

用来检测离群值的移动方法,指定为下列方法之一:

方法说明
‘movmedian’离群值定义为在 window 指定的窗口长度内,与局部中位数相差超过三倍局部换算 MAD 的元素。
‘movmean’离群值定义为在 window 指定的窗口长度内,与局部均值相差超过三倍局部标准差的元素。

离群点补偿阈值设置

Find the outlier in a vector of data, and replace it using the ‘clip’ method. Plot the original data, the filled data, and the thresholds and center value determined by the detection method. ‘clip’ replaces the outlier with the upper threshold value.

A = [60 59 49 49 58 100 61 57 48 58 200 0 500 41];
x = 1:length(A);
[B,TF,lower,upper,center] = filloutliers(A,'clip');
plot(x,A,x,B,'o',x,lower*ones(1,length(A)),x,upper*ones(1,length(A)),x,center*ones(1,length(A)))
legend('Original Data','Filled Data','Lower Threshold','Upper Threshold','Center Value')

请添加图片描述

### 如何在 MATLAB 中检测并移除数据集中的异常值 #### 使用统计方法识别异常值 一种常见的做法是基于统计数据来判断哪些点属于异常值。通常,如果某个数值偏离平均数超过三个标准差,则认为其为异常值。 对于一维数组 `data` ,可以通过以下方式计算: ```matlab meanData = mean(data); stdDeviation = std(data); % 定义阈值为均值加减三倍的标准差 upperBound = meanData + 3 * stdDeviation; lowerBound = meanData - 3 * stdDeviation; % 找到不在这个范围内的索引 outliersIndex = find(data > upperBound | data < lowerBound); ``` 这种方法简单直观,在实际应用中效果良好[^1]。 #### 利用箱线图法(IQR) 另一种常用的技术叫做四分位间距(IQR),它不依赖于正态分布假设。具体来说就是找出第25百分位(Q1)和75百分位(Q3), 计算 IQR=Q3-Q1, 并设定上下限分别为 Q1−k×IQR 和 Q3+k×IQR (一般取 k=1.5 或者 k=3 ) 来筛选出可能存在的离群点: ```matlab q1 = prctile(data, 25); % 下四分位数 q3 = prctile(data, 75); % 上四分位数 iqrValue = q3 - q1; % 四分位距 thresholdFactor = 1.5; % 可选参数,默认设为1.5 lowerThreshold = q1 - thresholdFactor*iqrValue; upperThreshold = q3 + thresholdFactor*iqrValue; anomalyIndices = find((data<lowerThreshold)|(data>upperThreshold)); ``` 上述两种策略都可以有效地帮助发现潜在的异常情况,并据此采取措施予以处理,比如删除这些样本或将它们替换为合理的估计值[^2]。 #### 数据清理后的操作建议 一旦确定了哪些条目被认为是异常项之后,可以根据具体情况决定是要完全去除那些记录还是要对其进行修正。如果是后者的话,可以选择填补缺失的数据或者是通过插补的方式恢复合理的结果。 为了确保模型训练的质量以及后续分析的有效性,应当优先考虑使用较为干净整洁的数据集进行实验验证工作。当面对复杂的真实世界场景时,往往还需要结合领域专业知识进一步优化预处理流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值