Matlab异常值检测:几种常用方法实现

张开发
2026/4/18 1:41:25 15 分钟阅读

分享文章

Matlab异常值检测:几种常用方法实现
文章目录为什么要检测异常值方法一四分位距法IQR方法二3σ 准则方法三基于密度检测方法四孤立森林方法五聚类方法单变量 vs 多变量找到异常值怎么办小结做数据分析第一步往往就是异常值检测不正常的点不找出来会把整个模型带偏。Matlab 里做异常值检测有好几种方法本文整理常用的代码直接就能用。为什么要检测异常值异常值可能来自测量错误、记录错误也可能就是真的稀有事件。不管来源不处理的话拟合曲线会偏统计量均值方差不准模型训练容易过拟合所以拿到数据先扫一遍有没有异常值处理完再往下分析。方法一四分位距法IQR最简单常用不假设数据分布鲁棒性好。原理排好序找 25% 分位数 Q1 和 75% 分位数 Q3IQR Q3 - Q1异常值判定小于 Q1 - 1.5×IQR 或者大于 Q3 1.5×IQR代码实现functionoutlier_idxiqr_detect(data)% IQR_DETECT 四分位距法检测异常值% outlier_idx iqr_detect(data) 返回逻辑索引true是异常值Q1quantile(data,0.25);Q3quantile(data,0.75);IQRQ3-Q1;lowerQ1-1.5*IQR;upperQ31.5*IQR;outlier_idxdatalower|dataupper;end用法data[normrnd(0,1,1,100),10,-8];% 加两个异常值idxiqr_detect(data);fprintf(检测到%d个异常值\n,sum(idx));clean_datadata(~idx);% 去掉异常值箱线图直接帮你标出来figure;boxplot(data);红加号就是异常值一眼看出来。方法二3σ 准则假设数据服从正态分布偏离均值三倍标准差就算异常值。代码functionoutlier_idxthree_sigma_detect(data)mumean(data);sigmastd(data);outlier_idxabs(data-mu)3*sigma;end这个方法简单数据真的近似正态分布效果很好。数据偏态或者有多个峰效果就差了。方法三基于密度检测局部离群因子算法 LOF比较每个点局部密度密度远低于邻居就是异常值。Matlab 统计工具箱有lofd函数% R2021a以后支持[scores,labels]lof(X,5);% 5个邻居outlier_idxscores1.5;% 分数越大越可能异常X 是 n×d 数据矩阵每行一个样本高维数据也能用。方法四孤立森林孤立森林适合高维数据速度快。统计机器学习工具箱自带iforestIsolationForest;[~,scores]iforest.fitPredict(X);outlier_idxscores0.7;% 得分越高越异常分数范围 0 到 1一般 0.6-0.7 当阈值自己调。方法五聚类方法kmeans 聚类之后每个点到最近聚类中心距离太大就是异常[idx,centers]kmeans(X,k);dzeros(size(X,1),1);fori1:size(X,1)d(i)norm(X(i,:)-centers(idx(i),:));end% 距离超过三倍标准差算异常outlier_idxdmean(d)3*std(d);本来就要聚类顺便找异常一举两得。单变量 vs 多变量单变量IQR 或者 3σ简单快足够用多变量高维孤立森林、LOF效果更好大部分情况你就分析一两个变量IQR 足够代码三行搞定。找到异常值怎么办几种处理方式数据量够异常少直接删掉不能删用中位数或者均值替换推荐中位数鲁棒时序数据插值填充保持连续性异常本身就是要找的保留单独分析别上来就删先看看为什么异常是真错了还是本来就有极端值。有些问题就是要找异常比如 fraud 检测异常才是目标。小结单变量优先 IQR不假设分布稳定正态分布数据3σ 简单直接多变量高维孤立森林可视化boxplot 一眼看出来异常值检测不难选对方法代码直接套检测完再处理后面分析结果才可靠。

更多文章