一、异常值处理中的扫地僧——3σ准则
各位攻城狮们注意啦(敲黑板)!今天咱们要解锁的是数据预处理中的隐藏技能——基于3σ准则的异常值清洗大法。这个统计学界的老前辈,在处理正态分布数据时简直就是扫地僧般的存在!
先给萌新们科普下(推眼镜):对于服从正态分布的数据,3σ准则认为99.73%的数据都会乖乖地落在均值±3倍标准差的范围内。那些不守规矩的"异类",就会被我们无情地打上异常值的标签!(画外音:当然实际应用中2σ也常用哦)
二、手把手教你写清洗代码
2.1 数据生成与可视化
先来点虚拟数据热热身:
% 生成1000个正态分布的乖孩子
clean_data = 50 + 10*randn(1000,1);
% 混入20个捣蛋鬼(异常值)
outliers = [80*ones(10,1); -30*ones(10,1)];
raw_data = [clean_data; outliers];
% 洗牌操作
raw_data = raw_data(randperm(length(raw_data)));
上可视化大法更直观:
figure
subplot(2,1,1)
histogram(raw_data,30)
title('原始数据分布')
xlabel('数值'), ylabel('频次')
subplot(2,1,2)
boxplot(raw_data)
title('箱线图预警')
2.2 核心清洗代码
准备好接大招了吗?完整清洗流程如下:
% 核心算法区(建议保存为函数)
mu = mean(raw_data); % 计算均值
sigma = std(raw_data); % 计算标准差
threshold = 3; % 阈值可调
% 异常值检测
is_outlier = (raw_data < mu - threshold*sigma) | ...
(raw_data > mu + threshold*sigma);
% 异常值替换(这里用NaN代替)
cleaned_data = raw_data;
cleaned_data(is_outlier) = NaN;
% 或者用邻近均值法替换
% cleaned_data(is_outlier) = mu;
2.3 效果验证三连击
验证清洗效果不能少:
% 可视化对比
figure
hold on
histogram(raw_data, 'BinWidth',5)
histogram(cleaned_data, 'BinWidth',5)
legend('原始数据','清洗后数据')
% 统计报表
fprintf('异常值数量:%d个\n',sum(is_outlier))
fprintf('清洗比例:%.2f%%\n',100*sum(is_outlier)/length(raw_data))
% 数据保存
writetable(table(cleaned_data), 'cleaned_data.csv')
三、实战中的避坑指南
3.1 那些年我们踩过的坑
- 非正态分布数据用3σ准则,效果可能扑街!(解决方案:改用箱线图法或MAD法)
- 阈值设置太严格会把好数据误杀(建议:先用2σ试水)
- 异常值直接删除导致数据缺口(推荐:替换为均值/中位数/插值)
3.2 高级玩法扩展
想更智能?试试动态阈值:
% 迭代式清洗
for i = 1:3
mu = mean(cleaned_data,'omitnan');
sigma = std(cleaned_data,'omitnan');
is_outlier = abs(cleaned_data - mu) > 3*sigma;
cleaned_data(is_outlier) = NaN;
end
四、3σ准则的适用场景
4.1 最佳拍档
- 传感器数据清洗(温度、压力等)
- 金融交易数据过滤(异常交易检测)
- 生物医学数据预处理(剔除测量误差)
4.2 不适用情况
- 偏态分布数据(如收入数据)
- 多峰分布数据集
- 小样本数据(n<30慎用)
五、课后彩蛋
想玩点更炫酷的?试试结合滑动窗口的局部3σ处理:
window_size = 50; % 滑动窗口大小
for i = 1:length(raw_data)-window_size
window_data = raw_data(i:i+window_size);
local_mu = mean(window_data);
local_sigma = std(window_data);
if abs(raw_data(i) - local_mu) > 3*local_sigma
cleaned_data(i) = local_mu;
end
end
记得在实际应用中要做好数据备份哦!异常值处理既是科学也是艺术,不同场景需要灵活调整参数。快去用这个神器给你的数据洗个澡吧~(完)
MATLAB用3σ准则清洗数据教程
4142

被折叠的 条评论
为什么被折叠?



