kmp openharmony 鲁棒 MAD 异常打分与稳健异常筛选
稳健异常检测方法摘要 本文提出基于中位数和MAD(Median Absolute Deviation)的稳健z分数方法,用于含极值数据的异常检测。相比传统均值+标准差方法,MAD对厚尾和偏态分布更具鲁棒性,适合日志、指标等数据的快速异常筛查。文章详细阐述了MAD原理、稳健z分数计算及分级策略,并给出Kotlin实现方案和ArkTS前端交互设计。工程化建议包括阈值调优、TopK抽样、指标联动等,强调
·

基于 中位数 + MAD (Median Absolute Deviation) 构造稳健 z 分数,对含极值/脏点的数据做异常打分与排行。相比均值+标准差,MAD 对厚尾与偏态分布不敏感,更适合日志、观测指标或埋点信号的快速异常甄别。
1. 背景与场景
- 指标含尖刺:延迟、错误率、流量在抖动中夹杂尖刺,需过滤噪声后抓住真正异常。
- 数据含脏点:采集抖动、重复上报或探针缺失会污染均值,导致阈值漂移。
- 低成本筛查:无需模型,仅靠稳健统计即可得到“异常强度”排序,便于值班与自助分析。
优势:
- 稳健性:MAD 以中位数为核心,抗极值、抗偏态。
- 可解释:|z| 越大越异常,阈值 3~3.5 常用。
- 轻量落地:无需训练,KMP 侧实现,ArkTS 直接调用。
2. 原理拆解
- 稳健尺度估计:MAD = median(|x - median(x)|),乘以 1.4826 使其在正态假设下与标准差同尺度。对厚尾、偏态和含脏点数据,比方差/标准差更稳健。
- 得分函数:
score = |x - median| / (MAD * 1.4826)。当 MAD≈0(序列近似常量)时,退化为基于绝对偏差的过滤,避免除零。 - 分级策略:3~3.5 视作“弱异常”,4~6 为“中等”,≥6 为“强异常”;结合业务语义做二次分级(错误率更敏感,延迟可适当放宽)。
- 多指标联合:MAD 得分衡量尖刺强度,可与自相关/滑动均值/分位数带结合,降低周期性波动的误报。
- 抗小样本偏置:N<10 时中位数波动大,可考虑引入最小样本门槛或使用分位数带补偿。
3. Kotlin 算法实现 (robustMadAnomalyScorer)
输入格式:
threshold=3.5
topk=5
series=12,12,13,15,40,16,17,120,18,19
threshold:稳健 z 分数阈值,默认 3.5。topk:返回前 K 个得分最高的点,默认 5。series:数值序列,逗号/空格/分号均可。
实现要点:
- 计算 中位数、绝对偏差的中位数 (MAD),并乘以 1.4826 逼近正态分布标准差。
- 稳健 z 分数:
|x - median| / (MAD × 1.4826),支持 TopK 排名与阈值筛选。 - 输出“异常排行 + 全量分数 + 工程化解读”,格式化为易读文本。
- 对 NaN/INF/空字符串先做过滤;MAD<1e-9 时直接返回“序列稳定”提示。
复杂度:
- 时间:
O(N log N)(排序求中位数)。 - 空间:
O(N)(存储序列及偏差)。
4. ArkTS 前端布局与交互(pages/Index.ets)
- 顶部信息条展示“自相关 + MAD”双算法标签与点数摘要,便于一屏概览。
- 左侧卡片:窗口自相关输入(window/lag/series)与运行按钮,结果以表格文本呈现。
- 右侧卡片:MAD 输入(threshold/topk/series),运行后展示异常排行与稳健 z 分数。
- 底部双列结果区域并排展示两套输出,对比周期性与异常强度。
- 输入校验:空序列或非数值直接提示;TopK、threshold 单独校验,避免互相阻塞。
调用方式:
import { dataWindowAutocorrAnalyzer, robustMadAnomalyScorer } from './hellokjs'
// 自相关
this.autocorrResult = dataWindowAutocorrAnalyzer(payload)
// MAD
this.robustResult = robustMadAnomalyScorer(payload)
布局改动侧重卡片分区、双列结果与独立加载态,避免仅调色。
5. 工程化落地建议
- 阈值调优:从 3~3.5 起步,异常过多则升高,过少则降低。
- TopK 抽样:前端展示 TopK,完整结果可流式写日志或上报。
- 指标联动:将 MAD 分数与自相关结果并用,既看周期性,也看异常强度。
- 在线处理:MAD 对流式也友好,可按滑窗维护中位数/偏差(后续可扩展)。
- 告警分级:|z| ∈ [3,4) 低度异常,[4,6) 中等,≥6 高度,结合业务语义二次分级。
- 数值稳定性:当 MAD < 1e-9 视为常量序列,直接返回“序列稳定”且分数置 0。
- 缺失/脏值处理:预过滤 NaN/INF/空字符串;可选 Winsorize(裁剪极端值到分位数)后再做 MAD,降低单点污染。
- 性能建议:批量 N<1e6 时 O(N log N) 足够;更大流式场景可用近似中位数(P² 分位算法)或分桶计数估中位。
6. 快速检查清单
- 输入格式正确,至少 3 个数值;NaN/INF 已过滤。
- 阈值、TopK 为正数;序列可含空格/分号。
- 结果为空时提示“序列稳定”而非报错;MAD≈0 时不除零。
- UI 并排展示两套结果,加载态独立,避免互相阻塞。
- 定期刷新中位数基线(按周/月),防止陈旧基线带来虚假异常。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐
所有评论(0)