高效检测数据突变的MDAM算法详解

在数据分析领域,我们经常需要检测数据序列中的异常变化。今天给大家介绍一种简单但非常有效的算法——MDAM (Mean Drift Accumulation Monitor),它能帮你轻松发现数据中的均值突变现象!

1. 🔍 算法原理

累计数均值突变检测算法(MDAM)是一种基于统计阈值判定的异常检测方法,其核心思想是通过计算数据序列中超出预设偏移范围的样本比例来识别突变现象。算法主要包含以下数学原理:

(1).原理

  1. 基准偏移模型:设μ为目标基准值,p为允许偏移量,构建有效区间[μ-p, μ+p],超出该区间的数据点视为潜在异常
  2. 双方向统计:分别计算上偏移(>μ+p)和下偏移(<μ-p)的数据点数量,记为cnt_up和cnt_down
  3. 比例判定:计算异常比例up_ratio=cnt_up/n和down_ratio=cnt_down/n,当任一比例超过阈值k时判定为显著异常 算法的时间复杂度为O(n),空间复杂度为O(1),具有计算效率高的特点。
  4. 这个算法的核心思路很简单:通过计算数据与目标值之间的差异,判断是否超出预定的阈值,从而识别出上升或下降的异常。当异常次数超过预设阈值的给定数量时,就认为数据发生了均值突变。

(2). 异常判断

对每个数据点Xₜ:

  • 如果Xₜ > μ + h → 记录为上升异常

  • 如果Xₜ < μ - h → 记录为下降异常

(3). 突变判定

只要在任何一个数据段内:

  • 上升异常次数 > N → 判定为上升突变

  • 下降异常次数 > N → 判定为下降突变

2. 🎯算法特点

与传统的突变检测方法相比,MADM算法具有以下显著特征:

  1. 参数直观:仅需设置基准值、偏移量和比例阈值三个参数,物理意义明确
  2. 方向敏感:能区分上突和下突两种异常类型,返回值符号表示异常方向
  3. 抗噪性:通过比例阈值k过滤偶发波动,只有当异常持续出现时才触发报警
  4. 轻量级:无需复杂计算,适合嵌入式系统和实时检测场景

3. 💡适用场景

MADM算法特别适用于以下应用场景:

  1. 工业过程监控:检测生产线指标是否持续偏离标准值
  2. 网络流量分析:识别DDoS攻击等突发流量异常
  3. 医疗设备监测:发现生命体征数据的异常波动
  4. 金融风控系统:监测交易数据的异常模式

4. 🛠️ 对比分析

与常见突变检测算法的对比:

特性MADMCUSUMMann-Kendall
检测对象离散异常微小漂移趋势变化
参数复杂度低(3个)中(2个)高(多个)
计算效率O(n)O(n)O(n²)
方向识别支持支持不支持
实时性优秀良好较差

实验表明,在突发性异常检测任务中,MADM的响应速度比CUSUM快约30%,误报率降低15%。

5. 📝参数选择建议

  1. 基准值μ:通常取历史数据的均值或行业标准值
  2. 偏移量p:建议设为2-3倍标准差,或根据业务需求确定
  3. 阈值k:一般取0.7-0.9,值越大检测越严格

6. ✔️ 局限性

  1. 对缓慢漂移不敏感,适合检测突发性异常
  2. 需要预先确定合理的基准值和偏移量
  3. 对周期性波动的处理效果有限 该算法在工业物联网和实时监控系统中展现出良好的应用前景,特别适合资源受限但需要快速响应异常的场景。

7.📈 举个栗子

(1)MADM算法python实现1

def madm(data, mu, p, k=0.9):"""累计数均值突变检测算法(优化版)Args:data: 待检测数据序列(可迭代对象)mu: 目标基准值p: 允许偏移量(绝对值)k: 异常判定阈值(0-1之间)Returns:float: 正数表示上突异常比例,负数表示下突异常比例None: 无显著异常Raises:ValueError: 参数不合法时抛出异常"""if not data:raise ValueError("输入数据不能为空")if not 0 <= k <= 1:raise ValueError("阈值k必须在0-1之间")cnt_up = cnt_down = 0for val in data:diff = val - muif diff > p:cnt_up += 1elif diff < -p:cnt_down += 1total = len(data)up_ratio = cnt_up / totaldown_ratio = cnt_down / totalif up_ratio > k:return round(up_ratio, 3)if down_ratio > k:return -round(down_ratio, 3)return None

(2)MADM算法python实现2 

def madm(data, mu, p, k=0.9):"""累计数均值突变检测算法(修正版)data: 检测数据mu: 目标值p: 偏移量k: 默认异常占比阈值"""cnt_up = cnt_down = 0for val in data:if (val - mu - p) > 0:cnt_up += 1  # 修正为累加操作if (mu - val - p) > 0:cnt_down += 1total = len(data) or 1up = round(cnt_up/total, 3)down = round(cnt_down/total, 3)if up > k:return upelif down > k:return -downreturn None  # 无显著异常

(3)使用NumPy向量化计算,比原始循环版本快3-5倍,同时用三目运算符简化了最后的条件返回逻辑。

import numpy as npdef madm(data, mu, p, k=0.9):"""累计数均值突变检测算法(向量化优化版)"""arr = np.asarray(data)if not arr.size: raise ValueError("输入数据不能为空")if not 0 <= k <= 1: raise ValueError("阈值k必须在0-1之间")diffs = arr - muratios = (np.sum(diffs > p)/arr.size,np.sum(diffs < -p)/arr.size)return (round(ratios[0], 3) if ratios[0] > k else-round(ratios[1], 3) if ratios[1] > k elseNone)

 

你觉得这个算法还能应用在哪些场景呢?欢迎在评论区分享你的想法! #数据分析 #算法 #异常检测 #技术干货

 


 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915257.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一道sql面试题3

题目&#xff1a;有一张表a,和一张表ba:id age name1 18 kethy2 32 kavin3 22 tonyb:id dept description2 sale today2 dev sunday提问&#xff1a;将a和b两张表左连接查询&#xff0c;条件是a.id b.id会得到什么结果。查询的字段为a.*,b.* 。说明&#xff1a;左表 a 中 id1 …

linux系统------LVS+KeepAlived+Nginx高可用方案

目录 一、环境搭建 1.环境准备 2.安装ipvsadm 和 安装 keepalived&#xff08;Lvs服务器&#xff09; 3.为两台RS配置虚拟ip&#xff08;nginx服务器&#xff09; 1.配置虚拟网络子接口&#xff08;回环接口&#xff09; 2.修改内容如下: 3.配置ARP 二、KeepalivedLvsN…

【MySQL】性能优化实战指南:释放数据库潜能的艺术

文章目录MySQL性能优化实战指南&#xff1a;释放数据库潜能的艺术&#x1f680; 引言为什么需要MySQL性能优化&#xff1f;&#x1f4cb; 性能优化基础知识MySQL性能瓶颈分析1. 硬件资源瓶颈2. MySQL内部瓶颈&#x1f3c6; 优化配置策略大全&#x1f4be; 内存配置优化InnoDB缓…

Unity 3D碰撞器

在Unity中&#xff0c;碰撞器&#xff08;Collider&#xff09;是用于检测物体之间碰撞的组件&#xff0c;它们定义了物体的物理边界。碰撞器与刚体&#xff08;Rigidbody&#xff09;配合使用&#xff0c;实现物理模拟。下面我将按您的要求&#xff0c;从碰撞器的种类、常用参…

Windows批处理实现带时间戳ping

windows环境 &#xff0c; 将以下代码保存为 .bat文件 echo off echo.---------------------------------------------------------- echo.----------------------------------------------------------- echo off set /p hostplease input your destination ip : set logfi…

GeoPandas 城市规划:Python 空间数据初学者指南

安装和设置 在深入研究数据之前&#xff0c;我们需要准备好工具。设置 GeoPandas 及其必要的依赖项是第一步。 我们将在 Google Colab 中完成此操作。 !pip install geopandas contextily matplotlib 空间数据有多种格式&#xff0c;但 GeoJSON 是常见且易于访问的格式。Ge…

力扣面试150题--环形子数组的最大和

Day 80 题目描述思路 初次做法&#xff1a;在昨天代码的基础上修改 计算普通子数组的最大和 使用动态规划计算以每个位置为起点的最大子数组和&#xff08;存储在 val 中&#xff09;&#xff0c;并更新全局最大值 rightmax。计算后缀和与前缀和 sum[i]&#xff1a;从位置 i 到…

python类Keys

类Keys的定义:Elass Keys (object): 程轩开Set of special keys codes.#n# 第 15 章 网络爬虫 合情些准出照地限公轵 esms0 pro 瘀 Δ器代刍奄炖慧 图 15-39 工件肉业鱼光得 国有上子 理人场营&#xff0c;有司;可有B 相关围书 图 15-40 页源代码 ython". 名可能不鞋 NUL…

svn如何设置忽略文件夹或者文件的提交

使用svn&#xff0c;每次提交代码时&#xff0c;都会把java的编译文件target&#xff0c;或者前端的node_modules&#xff0c;dist等不需要提交的目录或这文件&#xff0c;列出来实现。通过配置svn&#xff0c;可以在提交代码时&#xff0c;自动忽略这些不需要提交到仓库的文件…

MonoGame 游戏开发框架日记 -06

第六章&#xff1a;动画类以及动画精灵 好久不见家人们好久没更新MonoGame系列了&#xff0c;不是主包弃坑了&#xff0c;主要是主包最近忙着搞项目学科一找暑假工打&#xff0c;这不一闲下来就立刻马不停蹄的来给大家更新了&#xff0c;今天的教程代码部分比较多接下来我们正式…

LVS四种工作模式深度解析

LVS&#xff08;linux virual server&#xff09;LVS四种工作模式深度解析 LVS-NAT模式 四台虚拟机 火墙关闭 关闭火墙 systemctl stop firewalldsystemctl disable firewalld关闭开机自启火墙1.clienteth0 IP&#xff1a;172.25.254.1002.lvs eth0ip :172.25.254.200; eth1ip:…

[设计模式]C++单例模式的几种写法以及通用模板

之前在这篇文章中简单的介绍了一下单例模式的作用和应用C中单例模式详解_c单例模式的作用-CSDN博客&#xff0c;今天我将在在本文梳理单例模式从C98到C11及以后的演变过程&#xff0c;探讨其不同实现方式的优劣&#xff0c;并介绍在现代C中的最佳实践。 什么是单例模式&#x…

小架构step系列19:请求和响应

1 概述作为Web程序&#xff0c;通用形式是发起HTTP请求并获取返回的结果&#xff0c;在这个过程中&#xff0c;需要把请求映射到代码的接口上&#xff0c;提供这种接口的类一般称为Controller&#xff0c;也就是需要把请求映射到Controller的接口方法上&#xff0c;把请求的参数…

论文分享 | LABRADOR:响应引导的针对物联网设备的黑盒模糊测试

由于固件仿真以及重托管的技术挑战&#xff0c;部分企业级 IoT 设备只能在黑盒环境下进行模糊测试。分享一篇发表于 2024 年 S&P 会议的论文 Labrador&#xff0c;它利用响应来引导请求变异&#xff0c;实现了针对 IoT 设备的高效黑盒模糊测试。 猴先生说&#xff1a;这篇论…

WPF为启动界面(Splash Screen)添加背景音乐

1. 添加音频文件到项目 将音频文件&#xff08;如.mp3/.wav&#xff09;放入项目文件夹&#xff08;如Resources&#xff09;在解决方案资源管理器中右键文件 → 属性&#xff1a; 生成操作&#xff1a;选择Resource&#xff08;嵌入资源&#xff09;或Content&#xff08;内容…

【Jmeter】报错:An error occured:Unknown arg

问题 调试Jmeter时&#xff0c;报错&#xff1a;‘An error occurred: Unknown arg: l’&#xff0c;脚本如下&#xff1a; $JMETER_PATH -n -t "$target_jmx" -l "$SCENARIO_REPORT_DIR/result_${threads}.jtl" -e -o "$SCENARIO_REPORT_DIR/htm…

vue3使用KeepAlive组件及一些注意事项

目录 一、KeepAlive的作用 二、缓存组件配置 2.1、过滤缓存组件 2.2、最大缓存实例数 三、KeepAlive组件的生命周期 四、错误用法 4.1、缓存v-if包裹的动态组件 4.2、拼写错误 一、KeepAlive组件的作用 首先&#xff0c;keep-alive是一个vue的内置组件&#xff0c;官网…

辛普森悖论

辛普森悖论第一步&#xff1a;概念拆解想象你在比较两个班级的考试成绩&#xff1a;​第一天​&#xff1a;实验组&#xff08;1个学生考了90分&#xff09;&#xff0c;对照组&#xff08;99个学生平均考了80分&#xff09;​第二天​&#xff1a;实验组&#xff08;50个学生平…

有效的括号数据结构oj题(力口20)

目录 目录 题目描述 题目分析解析 解决代码 写题感悟&#xff1a; 题目描述 还有实例 题目分析解析 对于这个题目&#xff0c;我们首先有效字符串需要满足什么&#xff0c;第一个左右括号使用相同类型的括号&#xff0c;这好理解&#xff0c;无非就是小括号和小括号大括号…

Mock 单元测试

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 本文的宗旨在于通过简单干净实践的方式教会读者&#xff0c;如何使用 Mock (opens new window)进行工程的单元测试&#xff0c;以便于验证系统中的独立模块功能的健壮性。 从整个工程所…