机器学习应用 | 使用 MATLAB 进行异常检测(上)

异常检测任务,指的是检测偏离期望行为的事件或模式,可以是简单地检测数值型数据中,是否存在远超出正常取值范围的离群值,也可以是借助相对复杂的机器学习算法识别数据中隐藏的异常模式。

在不同行业中,异常检测的典型应用场景包括:

根据设备传感器采集的信号,识别零部件故障类型

自动检测生产线中产品加工异常,降低不良率或辅助质检人员提高工作效率

监控金融交易中是否存在诈骗行为

根据医学影像数据,识别癌组织及其边界

针对异常数据的不同,以及是否可以人为判断异常行为或故障模式,实现方式各有千秋。本文分为上下两篇,在第一部分,将梳理异常检测问题的一般处理思路,第二部分则结合示例重点讨论基于统计和机器学习的无监督异常检测方法。

什么是异常值

异常值包括离群值和奇异值,以下是相关定义:

离群值(outlier):偏离正常范围的数据,可能是由传感器故障、人为录入错误或异常事件导致,在构建机器学习或统计模型前,如果不对离群值做任何处理,可能会导致模型出现偏差。

奇异值(novelty):数据集未受到异常值污染,但是存在某些区别于原数据分布的观测数据。

首先,了解你的数据

在一头扎进算法或模型开发之前,首先需要做的是仔细查看手中的数据,并考虑以下问题:

01

原始数据中的异常是否是显而易见的?

机电设备的停机、堵转等异常现象,从信号波形就可以直接判断异常原因和发生时间,这类问题比较简单,常用突变点检测函数  findchangepts 或过程控制 SPC (Statistical Process Control) 中 control chart 进行处理。例如图 1(a) 中超出上下置信区间的数据点即为异常点,具体可查看示例:Find abrupt changes in signal[1] ,Control Charts[2] ,统计过程控制[3]

02

从原始数据中是否可以提取出能够有效区分异常的特征?

旋转机械设备的正常和异常数据,从时域信号的波形看上去往往相差无几,但是经过频域变换后,不同频率分量的幅值,可能有较大的不同,这种情况下,可根据频域特征直接检测出异常,如图 1(b) 中标记的异常部分。

03

从统计分析的角度,是否可以分区异常和正常数据?

Predictive Maintenance Toolbox™ 内置的Diagnostic Feature Designer App,可以帮助我们提取时域和频域特征,并分析其统计分布,例如,在工业设备应用中,利用三轴加速度传感器,分别采集设备维护前(蓝色)和维护后(红色)的振动信号,如图 1(c) 所示,对这两类信号(每类多个样本)提取标准差、斜度等常用统计特征,再分析两类信号的特征直方图,见图 1(d),不难看出,二者的各个特征的统计分布均存在一定差异。此外,在 Diagnostic Feature Designer App 中,还可以使用一系列特征排序的方法,例如在有标签或无标签的条件下,分别选用 One-Way ANOVA 和 Laplace Score 分析哪些特征可以更好地辅助判断,并利用这些特征作训练基于机器学习的异常检测模型。

图片

04

如果无法确定数据中是否存在特定的异常模式,应该如何处理?

在全天候运行的工业设备中,故障停机意味着产能的降低,因此设备运营阶段往往采取预防性维护的策略,这意味着异常数据稀缺,并且采集到数据全部或大多是正常数据,异常数据的占比往往较低(获取难度大风险高,或是无法描述异常模式),这也是为什么异常检测任务多被处理为无监督学习问题,仅仅通过正样本(正常数据)训练算法实现任务,或根据数据的隐藏特性筛选出其中的异常样本。

关于如何选择异常检测方法,可参考该链接了解更多相关函数和适用条件:Decision Models for Fault Detection and Diagnosis [4]

简单的一维数据异常检测问题

针对一维数据的异常值检测,处理方法有以下几种

是否超出历史数据的最大值/最小值

3σ 原则:如果数据符合正态分布,可将 ±3σ 作为极限误差,将落在 μ±3σ 以外样本作为离群值

可以通过箱线图分析/四分位数检验、Grubbs 等方法,进行检测。

例如,针对一组随机生成数,使用 boxchart 函数绘制箱线图,可以简单有效地可视化离群值,默认情况下,boxchart 使用 'o' 符号显示每个离群值。

% 创建一个一维的随机数向量data = randn(1,1000);boxchart(data,"DisplayName","random data")legend% 选取其中一个离群值ax = gca;chart = ax.Children(1);datatip(chart,"1",3.425);

图片

或者使用实时任务“清除离群值”,选择合适的检测方法和清理方法,并对数据分布和离群值进行可视化和处理:

图片

对于多变量(特征)数据集,特征之间可能存在复杂和高度非线性的相关性,上述离群值剔除的方法将不再适用。

高维数据的异常检测

接下来,通过一个基于工业设备振动信号的预测性维护示例,介绍如何着手处理高维数据的异常检测问题,在该例中,原始数据为使用加速度传感器采集的 x/y/z 三个通道的振动信号。在重要工业设备的实际运营过程中,使用者往往采取定期预防性维护的策略,以避免意外停机造成的风险和经济损失,而设备运行一段时间,可能存在一定的零部件磨损和老化问题,这也是导致异常的部分潜在原因,因此样本标签分为两类:“维护前”(before)和“维护后”(after)。

振动信号是典型的时间序列数据,在进行处理时,常用的方法之一是,按设定的时间窗口,对信号进行时域的统计特征提取或频域特征提取,从而转换成以下结构化数据形式:

load("FeatureEntire.mat")head(featureAll)

图片

关于如何进行特征提取,可在命令行窗口运行以下指令,打开对应参考文档查看:

>> openExample('predmaint_deeplearning/AnomalyDetectionUsing3axisVibrationDataExample')

将数据集划分为训练集和测试集:​​​​​​​

rng(0) idx = cvpartition(featureAll.label, 'holdout', 0.1);featureTrain = featureAll(idx.training, :);featureTest = featureAll(idx.test, :);

将测试集部分的标签进行替换,将“维护前”(before)定义为“异常”(Anomaly),“维护后”(after)定义为“正常”(Normal):​​​​​​​

trueAnomaliesTest = featureTest.label;trueAnomaliesTest = renamecats(trueAnomaliesTest,["After","Before"], ["Normal","Anomaly"]);featureTestNoLabels = featureTest(:, 2:end);

将训练集中“维护后”(after)的数据样本筛选出来,作为后续异常检测模型的训练样本:​​​​​​​

featureNormal = featureTrain(featureTrain.label=='After', :);feat = featureNormal{:,2:end};[NumSamples,Dim] = size(feat)

NumSamples=10282

Dim=12

这个数据集一共有 12 个维度的特征和 10282 条样本。

常用的高维数据可视化方法

为了方便理解数据,可采用以下方法,在低维空间内,对高维数据进行可视化:

1. 通过 plotmatrix 函数,随机抽取 3 个特征,将任意两个特征作为横纵坐标:​​​​​​​

plotmatrix(feat(:,randi(size(feat,2),1,3)))title('原始特征')

2. 使用 fsulaplacian 函数,利用 Laplacian Score 算法,选取最重要 2 个特征(第 9 和第 10 个特征)后,绘制其二维平面散点图,观察数据中是否存在某些特定的聚集现象。

​​​​​​​

idx = fsulaplacian(feat);idx(1),idx(2)

ans=9

ans=10​​​​​​​

scatter(feat(:,idx(1)),feat(:,idx(2)),4,'filled')title('基于Laplacian Score选择后的特征')

3. 仅选取其中最重要的特征,可通过 tSNE(t-Distributed Stochastic Neighbor Embedding)对数据进行降维:​​​​​​​

rng('default')X=tsne(feat,Standardize=true,Perplexity=100,Exaggeration=20);scatter(X(:,1),X(:,2),4,'filled')title('使用tSNE降维 - 二维')
X3=tsne(feat,Standardize=true,Perplexity=100,Exaggeration=20,NumDimensions=3);scatter3(X3(:,1),X3(:,2),X3(:,3),4,'filled')title('使用tSNE降维 - 三维')

图片

基于 tSNE 进行数据降维的过程中,将融合多个特征得到新的基向量,再将原始数据投射到对应基向量的低维空间进行可视化,在第二部分中,我们将利用这个方法查看训练样本中的异常情况。

有监督异常检测

Statistics and Machine Learning Toolbox™ 提供了基于模型的异常检测算法,如果已将训练数据标注为正常和异常,可以训练二类分类模型,并使用 resubPredict 和 predict 对象函数分别检测训练数据和新数据中的异常。当对设备的全生命周期中的不同状态,例如健康、老化、异常和寿命终末期有足够了解和相关数据标签时,可考虑数据拟合回归模型,或构建聚类模型,以区分不同状态数据。针对上述机器学习模型,以下对象函数常用于检测数据中的异常:

相似度矩阵 — 使用 outlierMeasure[6] 函数计算随机森林 (CompactTreeBagger) 中,样本和其他观测点之间相似度平方值的平均值;

马氏距离 — 使用mahal[7] 函数,适用于判别分析分类模型 (ClassificationDiscriminant) 和高斯混合模型 (gmdistribution)

无条件概率密度 — 使用 logp[8] ,适用于判别分析分类模型 (ClassificationDiscriminant) 和朴素贝叶斯分类模型 (ClassificationNaiveBayes),包括对应的增量学习模型 (incrementalClassificationNaiveBayes)

此外,利用 Deep Learning Toolbox 构建深度神经网络进行异常检测也是目前该领域的研究热点之一。

在光学检测领域,如图 2(a) 所示,需要检测图像数据中异常,可构建基于卷积神经网络的图像分类模型,并结合深度学习模型解析的方法,例如类激活映射,对异常区域进行可视化,具体示例可参考:Detect Image Anomalies Using Explainable One-Class Classification Neural Network。[9]

在设备预测性维护应用中,针对传感器信号中的异常检测,多用生成式模型,学习正常数据的特征,并尝试重建数据,再利用重建误差作为判定是否异常的指标,如图 2(b) 所示,例如自编码器AutoEncoder(Time Series Anomaly Detection Using Deep Learning )[10] 和 Graph Deviation Network (Multivariate Time Series Anomaly Detection Using Graph Neural Network) [11] 进行多元时序异常检测。

图片

 由于篇幅有限,在此先不详细展开介绍上述方法,如感兴趣,可参考对应文档链接。在下一篇中,我们将讨论在没有标签的条件下,或不确定异常类型和成因的场景中,如何针对上述数据集,利用统计和机器学习方法进行无监督异常检测,欢迎继续关注后续内容。

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

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

相关文章

EasyX图形化学习

1.EasyX是什么&#xff1f; 是基于Windows的图形编程&#xff0c;给用户提供函数接口&#xff0c;最终函数调用会由Windows的API实现。 注&#xff1a;EasyX只适配 c 。 2.头文件&#xff1a; <easyx.h>---只包含最新的函数 <graphics.h>---包含<easyx.h&g…

如何解决ajax浏览器缓存

在使用 Ajax 进行异步请求时&#xff0c;由于浏览器的缓存机制&#xff0c;可能会导致请求结果不符合预期或者无法获取最新的数据。以下是解决 Ajax 中浏览器缓存问题的几种常见方法&#xff1a; 添加时间戳或随机数&#xff1a;可以在每次请求时&#xff0c;给 URL 后添加一个…

集成学习算法随机森林发生过拟合时,如何调整超参数?

当随机森林算法发生过拟合时&#xff0c;可以通过调整以下超参数来解决问题&#xff1a; 1 n_estimators&#xff08;树的数量&#xff09;&#xff1a;增加树的数量可以降低模型的过拟合程度。通过增加树的数量&#xff0c;可以减少每棵树对最终预测结果的影响&#xff0c;从…

动态内存管理(扫盲式讲解)

前言&#xff1a;学好数据结构的三大法宝&#xff1a;指针、结构体、动态内存管理&#xff0c;指针前面讲的已经很细了&#xff0c;大家看完了基本上指针方法是没啥问题的 1 为什么要有动态内存的开辟&#xff1f; 因为动态内存的开辟是在堆区里面的&#xff0c;可以释放&…

Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)

Qt自带了一个Media Player的例子,如下图所示: 但是运行这个例子机会发现,连最基本的MP4格式视频都播放不了。因为QMediaPlayer是个壳(也可以叫框架),依赖本地解码器,视频这块默认基本上就播放个MP4,甚至连MP4都不能播放,如果要支持其他格式需要下载k-lite或者LAVFilte…

回归模型中多重共线性问题——逐步回归法、方差膨胀因子(VIF)、因子分析【含代码与解释】

特征之间的多重共线性&#xff0c;是指在回归模型中&#xff0c;自变量之间存在高度的线性相关性&#xff0c;导致回归系数的估计不准确&#xff0c;不稳定&#xff0c;甚至不可信的现象。多重共线性的存在会影响模型的解释能力和预测能力&#xff0c;增加模型的复杂度和不确定…

机器学习---环境准备

一、pySpark环境准备 1、window配置python环境变量 window安装python&#xff0c;配置python环境变量。安装python后,在环境变量path中加入安装的路径&#xff0c;cmd中输入python&#xff0c;检验python是否安装成功。 注意&#xff1a;如果使用的是anaconda安装的python环境…

MySql MVCC 详解

注意以下操作都是以InnoDB引擎为操作基准。 一&#xff0c;前置知识准备 1&#xff0c;MVCC简介 MVCC 是多版本并发控制&#xff08;Multiversion Concurrency Control&#xff09;的缩写。它是一种数据库事务管理技术&#xff0c;用于解决并发访问数据库的问题。MVCC 通过创…

Matlab使用基础

基本命令 clear all %清除Workspace中的所有变量 clc %清除Command Window中的所有命令 %和%%是注释基础函数 abs()%取绝对值 char(65)%将ASCII码数值变成字符 num2str(65)%将里面的内容变成字符串 length()%字符串长度&#xff0c;不把/0的长度计算进去 矩阵 A[1 2 3;4 5 …

C语言-指针运算

1 1 2&#xff1f; 给一个指针加1表示要让指针指向下一个变量 int a[10]; int *p a; *(p 1) —>a[1]如果指针不是指向一片连续分配的空间&#xff0c;如数组&#xff0c;则这种运算没有意义 指针运算 这些算术运算可以对指针做&#xff1a;给指针加、减一个整数&…

python循环遍历指定路径下所有文件夹和文件

可以使用Python的内置库os和os.path来遍历文件夹。以下是一个简单的示例&#xff0c;该示例遍历给定目录下的所有文件和文件夹&#xff0c;并打印出文件类型和名称。 import osdef print_files(path):for root, dirs, files in os.walk(path):for file in files:print(os.path…

MinIO使用

MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单&#xff0c;基本是复制可执行程序…

Python 有趣的几个案例

1 有趣的回文数 **题目需求&#xff1a;**对于任何自然数&#xff0c;将它自身和它的倒序数&#xff08;反转过来&#xff09;相加&#xff0c;再将得到的和与它的倒序数相加&#xff0c;一直重复&#xff0c;最终总会得到一个回文数。 提示&#xff1b;回文数&#xff0c;如 …

GUI的简单概述和基本使用

GUI的概念 1&#xff0c;到目前为止&#xff0c;我们编写的都是控制输入的程序&#xff0c;操作使用非常不直观&#xff0c;采取一直方式让效果呈现在窗口上。 2&#xff0c;GUI及图形界面指采用图像方式显示的用户界面&#xff0c;与早期计算机的命令行界面相比&#xff0c;…

p标签显示不全并且实现自动换行

之前的代码 发现效果是这样的 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5561e9dbe4b64cf49c85fcbac3f2c7c8.png) # 修改 添加word-wrap: break-word;"实现自动换行 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/59a9b5ef89eb4d0dbeae1cae…

【SpringCloud】通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题

文章目录 前言1.第一次尝试1.1服务被调用方更新1.2压测第一次尝试1.3 问题分析1.4 同步的不是最新列表 2.第二次尝试2.1调用方过滤下线服务2.2压测第二次尝试2.3优化 写到最后 前言 在上文的基础上&#xff0c;通过压测的结果可以看出&#xff0c;使用DiscoveryManager下线服务…

程序员如何开发高级python爬虫?

之前我有写过一篇“高级爬虫和低级爬虫的区别”的文章&#xff0c;我们知道它并非爬虫领域中专用术语。只是根据爬虫的复杂性来断定是否是高级爬虫。以我个人理解&#xff1a;高级爬虫是可能具有更复杂的功能和更高的灵活性的爬虫。下面我们围绕高级爬虫来了解下有趣的事情。 低…

从输入URL到页面加载的全过程

从输入URL到页面加载的全过程 输入URL&#xff0c;并按下回车 浏览器检查浏览器缓存、系统缓存、路由器缓存&#xff0c;如果缓存中有&#xff0c;则直接显示页面&#xff0c;如果没有进行下一步 根据URL通过DNS进行域名解析&#xff0c;获取IP地址 DNS解析过程&#xff1a;是一…

python可视化plotly 图例(legend)设置大全,值得收藏!

文章目录 一、图例(legend)二、update\_layout(legend{}) 相关参数及示例关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python…

多向通信----多人聊天

package 多人聊天; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; publ…