能碳数据清洗用MAD算法,窗口大小和阈值怎么调?

在能碳项目的边缘数据清洗中,很多工程师第一反应是用3-Sigma(三倍标准差)法则。但在真实的能耗数据面前,3-Sigma往往会失效。

原因在于能耗数据是典型的非平稳数据:白天高负荷时段波动大,夜间低负荷时段波动小。

如果用全局数据计算标准差,白天的高波动会把标准差整体拉大,导致夜间真正的异常被漏检;反之,如果只用夜间数据算标准差,标准差又会很小,白天正常的负荷波动反而会被误判为异常(误杀)。

这就是为什么在能碳数据清洗中,MAD(中位数绝对偏差)算法比3-Sigma更实用。MAD基于中位数,对极端值不敏感,天然适合非平稳的能耗时序数据。

MAD的核心实现逻辑

MAD的核心思想是:先找到数据中心位置(中位数),然后计算每个点偏离中心的程度,再取这些偏离程度的中位数作为"典型偏离尺度"。

具体步骤如下:

  1. 取最近N个采样点作为滑动窗口;
  2. 计算窗口内数据的中位数 Median;
  3. 计算每个点与 Median 的绝对偏差,再取这些偏差的中位数,结果即为MAD值;
  4. 当前点与 Median 的差值超过 k × MAD 时,判定为异常点。

代码实现:

复制代码
1def mad_outlier_detection(window, current_point, k=3.5):
2    # 1. 计算窗口中位数
3    median = np.median(window)
4    
5    # 2. 计算绝对偏差的中位数
6    abs_deviation = np.abs(window - median)
7    mad = np.median(abs_deviation)
8    
9    # 3. 判定当前点是否为异常
10    if mad == 0:
11        return False  # 所有值相同,无异常
12    
13    deviation = abs(current_point - median)
14    return deviation > k * mad

窗口大小怎么定

窗口大小是MAD算法最关键的参数之一,直接决定了算法的灵敏度和稳定性。

窗口太小(如3-5个点):对突发尖峰的判定过于敏感。设备启停瞬间的正常电流冲击,很容易被误判为异常并剔除,导致数据失真。

窗口太大(如30个点以上):对真实异常的响应变慢。如果传感器发生漂移,需要等窗口滑动很久才能检测到,清洗后的数据会有明显滞后。

推荐默认值:对于采样频率为1分钟一次的能碳数据,默认窗口大小设为10个采样点(即10分钟窗口)。这个长度既能覆盖设备启停的瞬态过程,又能保持对稳态异常的及时响应。不同设备可独立配置,比如电表用10个点,水表用15个点。

阈值k怎么调

k值决定了异常判定的严格程度。在实际工程中,不能用一个固定值打天下,需要根据数据积累阶段动态调整。

冷启动阶段(样本 < 10个):窗口刚填满时,统计基础薄弱,MAD值本身可能不稳定。此时应将阈值放宽到4.5-5.0,避免小样本误判把正常数据当异常杀掉。

稳态运行阶段(样本 > 30个):数据积累充足,MAD值趋于稳定。此时可收紧到3.0-3.5,这是工程实践中验证过的通用区间,能平衡误报和漏报。

不同设备的配置差异

桐盛在智慧公共空间场景中已将MAD清洗做成了标准交付能力,正在向公共机构能碳项目平移。

在能碳场景中,电表、水表、燃气表的工况完全不同,MAD窗口和阈值不能共用一套参数。

电表数据受设备启停影响大,瞬态尖峰多,窗口可以稍小(8-10个点),阈值取3.5;水表数据变化缓慢,偶发脉冲干扰,窗口可以稍大(15-20个点),阈值取3.0;燃气表数据通常比较平稳,但可能存在周期性波动,窗口和阈值需要根据实际工况现场标定。

核心原则是:参数配置必须跟着设备工况走,而不是跟着算法走。

相关推荐
Omics Pro1 小时前
澳科大:自进化AI虚拟细胞
数据库·人工智能·算法·机器学习·自然语言处理
Doubbbbbbble云1 小时前
从算法工程化角度看空间换时间策略的权衡4
算法
心中有你02141 小时前
Java Swing实现校园最短路径导航系统(Dijkstra算法完整源码+详细解析)
java·开发语言·算法
Alphapeople1 小时前
路径规划算法的python实现
开发语言·python·算法
LabVIEW开发1 小时前
从饱和升温曲线到参数辨识:在LabVIEW中拟合y=a(1-e^(-bx))
算法·labview·labview知识·labview功能·labview程序
keyipatience2 小时前
5种IO模型与阻塞IO,select,poll,epoll,LT和ET模式
linux·服务器·网络·数据结构·c++·算法
路径规划6663 小时前
(MATLAB代码) 船舶轨迹聚类:K-means 算法(260912)
算法·matlab·kmeans
wuyk5555 小时前
【Socket 进阶之路】第 3 章 TCP 三次握手 & 四次挥手深度剖析|连接建立、断开、状态机、TIME_WAIT 核心工程问题
服务器·开发语言·网络·物联网·网络协议·tcp/ip
wzdark9 小时前
基于堆的优先队列实现原理与复杂度分析4
算法