在这里插入图片描述

基于 中位数 + 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. 工程化落地建议

  1. 阈值调优:从 3~3.5 起步,异常过多则升高,过少则降低。
  2. TopK 抽样:前端展示 TopK,完整结果可流式写日志或上报。
  3. 指标联动:将 MAD 分数与自相关结果并用,既看周期性,也看异常强度。
  4. 在线处理:MAD 对流式也友好,可按滑窗维护中位数/偏差(后续可扩展)。
  5. 告警分级:|z| ∈ [3,4) 低度异常,[4,6) 中等,≥6 高度,结合业务语义二次分级。
  6. 数值稳定性:当 MAD < 1e-9 视为常量序列,直接返回“序列稳定”且分数置 0。
  7. 缺失/脏值处理:预过滤 NaN/INF/空字符串;可选 Winsorize(裁剪极端值到分位数)后再做 MAD,降低单点污染。
  8. 性能建议:批量 N<1e6 时 O(N log N) 足够;更大流式场景可用近似中位数(P² 分位算法)或分桶计数估中位。

6. 快速检查清单

  • 输入格式正确,至少 3 个数值;NaN/INF 已过滤。
  • 阈值、TopK 为正数;序列可含空格/分号。
  • 结果为空时提示“序列稳定”而非报错;MAD≈0 时不除零。
  • UI 并排展示两套结果,加载态独立,避免互相阻塞。
  • 定期刷新中位数基线(按周/月),防止陈旧基线带来虚假异常。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐