0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用MATLAB进行异常检测(下)

MATLAB 来源:MATLAB 作者:MATLAB 2022-11-24 10:46 次阅读

在使用 MATLAB 进行异常检测(上)中,我们探讨了什么是异常值,简单的一维数据异常检测问题,针对高维数据的有监督异常检测方法。 在(下)篇中,我们将和大家一起探讨无监督异常检测。

没有标签怎么办?试试无监督异常检测

参考文档页面:Unsupervised Anomaly Detection[1]

对于没有标签信息的多变量样本数据,在MATLAB 可以使用以下方法检测异常值:

· 马氏距离 (Mahalanobis Distance):

如果数据符合多变量正态分布,可使用样本到数据集分布中心的马氏距离检测异常。利用稳健协方差估计robustcov[2]函数计算马氏距离,进行离群值检测。

· 局部离群因子 (Local Outlier Factor, LOF):

基于观测点和邻近样本之间的相对密度检测异常点。利用 lof[3] 函数可以创建 LocalOutlierFactor 对象,针对训练数据,直接返回检测结果。

· 孤立森林 (Isolation forest):

通过一组孤立树模型,将异常值和正常数据点隔离。利用 iforest[4] 函数,创建 IsolationForest 对象,针对训练数据,直接返回检测结果。

· 单类支持向量机 (One Class SVM):

在无监督条件下,训练支持向量机模型,在变换后的高维空间,将数据点和原点分离。利用 ocsvm[5] 函数创建OneClassSVM 对象,针对训练数据,直接返回检测结果。

针对测试数据进行异常检测时,使用第一种方法的具体检测步骤将在下文中通过示例说明,如果使用另外三种算法,可以直接调用检测模型的对象函数 isanomaly()。

具体实现方式

1.利用马氏距离检测异常值

【定义】马氏距离:一种衡量样本和数据集分布间相似度的尺度无关的度量指标,例如y到中值点的距离是d2=(y-µ)Σ-1(y-µ)',其中Σ是多维随机变量的协方差矩阵,μ为样本均值。在MATLAB中可通过pdist2函数计算:

d = pdist2(feat,mean(feat),"mahalanobis");

马氏距离可以理解为是对欧式距离的一种修正,假设,下图中蓝色点和黄色点离样本均值的欧式距离相近,但是由于样本整体分布沿 f(x)=x 的方向分布(变量之间具有相关性),蓝色点更有可能是数据集中的点,对应的马氏距离更小,而黄色点更有可能是离群值,对应马氏距离也更大。因此,设定一个合理的阈值,可以划分异常样本和正常样本。

312cde4c-6b18-11ed-8abf-dac502259ad0.png

计算马氏距离,首先需要估计 Σ(sig) 和 μ(mu) 。极大似然估计(Maximum Likelihood Estimation, MLE)对数据中的异常值非常敏感,需要采取一种稳健的协方差估计方法,抵抗数据集中存在的异常观测数据。当数据中存在异常值时,协方差行列式偏大。使用最小协方差行列式估计 (Minimum Covariance Determinant, MCD),从 n 个数据样本中,最多选取h个观测值,找到协方差行列式最小的一组观测子集,计算其平均值和协方差,作为估计量。robustcov 函数提供了 FAST-MCD、OGK 和 Olive-Hawkins 三种算法供选择。假设训练数据集中,异常占比为 0.9%:

contaminationFraction = 0.09;
[sig,mu,mah,tf] = robustcov(feat, ...
  OutlierFraction=contaminationFraction);

如果数据符合正态分布的假设,马氏距离的平方值,将服从具有 Dim 个自由度的χ2分布,Dim 为原数据的维度。默认情况下,robustcov 函数假设数据符合多变量正态分布,并根据χ2分布的临界值,将输入样本的 2.5% 作为异常值,如需调整异常值占比,可以使用 chi2inv 函数,重新计算阈值:

mah_threshold = sqrt(chi2inv(1-contaminationFraction,Dim));
tf_robustcov = mah > mah_threshold;

利用pdist2函数,计算测试集的马氏距离后与阈值mah_threshold进行比较:

dTest = pdist2(featureTestNoLabels.Variables, ...
mean(featureTestNoLabels.Variables),"mahalanobis");
isanomalyTest = dTest > mah_threshold;
predTest = categorical(isanomalyTest, [1, 0], ["Anomaly", "Normal"]);

可视化检测结果:

tiledlayout(3,1)
nexttile
gscatter(X(:,1),X(:,2),tf_robustcov,[],'ox',3)
xlabel('X1')
ylabel('X2')
legend({'正常','异常'})
title("训练样本分类结果 (tSNE降维)")


nexttile
plot(d,mah,'o')
line([mah_threshold, mah_threshold], [0, 30], 'color', 'r')
line([0, 6], [mah_threshold, mah_threshold], 'color', 'r')
hold on
plot(d(tf), mah(tf), 'r+')
xlabel('Mahalanobis Distance')
ylabel('Robust Distance')
title('DD Plot')
hold off


nexttile
confusionchart(trueAnomaliesTest, predTest, ...
  Title="测试结果评估-混淆矩阵 (马氏距离)", Normalization="row-normalized");
314d5cee-6b18-11ed-8abf-dac502259ad0.jpg        

小结

·以上方法在高维数据上应用效果不理想,可以看到,测试集中异常数据假阴率高。这个方法适用于数据符合或接近正态分布的情况,但是通常情况下,实际数据的分布规律难以预估。

2.局部离群因子

参考文档页面:Local outlier factor model for anomaly detection[6]

该算法通过计算样本p和其周围 k 个近邻点的局部可达密度(local reachability density, lrd),即观测样本 p 到近邻点的局部可达距离平均值的倒数:

31833666-6b18-11ed-8abf-dac502259ad0.png

其中,为k近邻集合,样本p关于观测点o的局部可达距离定义为:

319644e0-6b18-11ed-8abf-dac502259ad0.png

其中 dk(0)为观测点到其近邻的第k个最小距离, d(p,0) 为样本 p 和观测点 o 之间的距离,可参考下图示意。

31b186c4-6b18-11ed-8abf-dac502259ad0.png

再根据p的局部可达密度与近邻点的局部可达密度比值的平均值,量化每个样本的离群程度,具体计算可参考以下公式:

31d2677c-6b18-11ed-8abf-dac502259ad0.png

Ird(·)为局部可达密度函数,|Nk(p)|为近邻数量。

因此,对于正常样本,一般 LOF 值小于或接近 1,意味着其局部可达密度和近邻点相近或更高,该样本和邻域内的样本同属一个簇,当 LOF 值大于 1 时,则可能为异常值,利用 ContaminationFraction 参数可调整 LOF 的阈值。

[mdlLOF,tfLOF,scoresLOF] = lof(feat, ...
  ContaminationFraction=0.09, ...
  NumNeighbors=1000, Distance="mahalanobis");
[isanomalyLOF,~] = isanomaly(mdlLOF, featureTestNoLabels.Variables);
predLOF = categorical(isanomalyLOF, [1, 0], ["Anomaly", "Normal"]);

可视化检测结果:

tiledlayout(3,1)
nexttile
gscatter(X(:,1),X(:,2),tfLOF,[],'ox',3)
xlabel('X1')
ylabel('X2')
legend({'正常','异常'})
title("训练样本分类结果 (tSNE降维)")

随机选取部分样本,查看对应 LOF 值/异常得分

nexttile
idxes = randi(NumSamples,1,60);
scatter(X(idxes,1),X(idxes,2),5,'filled','MarkerFaceColor','k')
hold on
bubblechart(X(idxes,1),X(idxes,2),scoresLOF(idxes)/100, ...
'r','MarkerFaceAlpha',0);
legend({'数据点','异常得分'})
hold off
title("训练样本异常得分分布")


nexttile
confusionchart(trueAnomaliesTest, predLOF, ...
  Title="测试结果评估-混淆矩阵 (LOF)", Normalization="row-normalized");
31e8681a-6b18-11ed-8abf-dac502259ad0.jpg        

小结

·优点:不受数据分布的影响,同时考虑了数据集的局部和全局属性,比较适用于中等高维的数据集,针对示例数据集的预测准确度比较理想。

·使用限制:对近邻参数较为敏感,由于需要计算数据集中任意两个数据点的距离,算法的时间复杂度较高,在大规模数据集上效率偏低,适合小规模到中等规模的数值型数据。

3.孤立森林

参考文档页面:Anomaly Detection with Isolation Forest[7]

孤立森林算法中,集成了多个决策树模型,训练时,每个决策树对一个不放回采样的数据子集进行分裂,以试图将每一个观测样本划分到一个对应的叶节点上。假设异常点与其他正常数据差异较大,从根节点到对应叶节点需要经过的路径长度(path length) 相对较短,对于每个样本,将孤立森林中的多个决策树路径长度的平均值,定义为对应样本的异常得分(anomaly score)。

32067832-6b18-11ed-8abf-dac502259ad0.png

[mdlIF,tfIF,scoreTrainIF] = iforest(feat, ContaminationFraction=0.09);
[isanomalyIF,~] = isanomaly(mdlIF, featureTestNoLabels.Variables);
predIF = categorical(isanomalyIF, [1, 0], ["Anomaly", "Normal"]);

可视化检测结果:

tiledlayout(3,1)
nexttile
gscatter(X(:,1),X(:,2),tfIF,[],'ox',3)
xlabel('X1')
ylabel('X2')
legend({'正常','异常'})
title("训练样本分类结果 (tSNE降维)")


nexttile
histogram(scoreTrainIF)
xline(mdlIF.ScoreThreshold,"k-",join(["Threshold =" mdlIF.ScoreThreshold]))
title("训练样本异常得分分布")


nexttile
confusionchart(trueAnomaliesTest, predIF, ...
  Title="测试结果评估-混淆矩阵 (孤立森林)", Normalization="row-normalized");
32274300-6b18-11ed-8abf-dac502259ad0.jpg        

小结

·优点:适合高维表格数据,不需要计算关于距离和密度的指标,具有线性时间复杂度,每个决策树可独立采样,支持并行化处理来实现加速。

·使用限制:孤立森林适用于训练集和测试集中,正常样本和异常样本占比接近的情况,且异常样本的特征与正常样本差异很大。

4.单类支持向量机

参考文档页面:Fit one-class support vector machine (SVM) model for anomaly detection[8]

单类支持向量机,或无监督支持向量机,构建决策边界,将训练集中的数据点尽可能划分为一个类别,位于决策边界之外的数据则为异常值。

策略是通过核函数将数据映射到新的高维特征空间,在数据与原点间构建超平面(n 维平面)。因为,在低维空间中的非线性特征往往不是线性可分的,在扩展到高维空间后是可分的。在 MATLAB 中,一种实现方法是使用用于构建标准的支持向量机分类模型的 fitcsvm 函数(MATLAB R2022b前),另一种实现方法是使用 ocsvm 函数(MATLAB R2022b 起)。

fitcsvm 函数的求解是基于 SVM 的对偶问题形式,需要求解每对样本的格拉姆矩阵(Gram Matrix),相关示例可在 MATLAB 命令行输入以下指令打开:

>> openExample('stats/DetectOutliersUsingSVMAndOneClassLearningExample')
3256a9f6-6b18-11ed-8abf-dac502259ad0.png

ocsvm 函数的求解则是基于 SVM 的原型问题形式,并使用高斯核进行一类学习,以找到决策边界,针对大规模数据集,求解效率更高。将 KernelScale 设为 "auto"以启发式地选取合适核函数参数。

[mdlSVM,tfOCSVM,scoreTrainOCSVM] = ocsvm(feat, ...
    ContaminationFraction=0.09, ...
    StandardizeData=true,KernelScale="auto");
[isanomalyOCSVM,~] = isanomaly(mdlSVM, featureTestNoLabels.Variables);
predOCSVM = categorical(isanomalyOCSVM, [1, 0], ["Anomaly", "Normal"]);

可视化检测结果:

tiledlayout(3,1)
nexttile
gscatter(X(:,1),X(:,2),tfOCSVM,[],'ox',3)
xlabel('X1')
ylabel('X2')
legend({'正常','异常'})
title("训练样本分类结果 (tSNE降维)")


nexttile
histogram(scoreTrainOCSVM, Normalization="probability")
xline(mdlSVM.ScoreThreshold,"k-", ...
  join(["Threshold =" mdlSVM.ScoreThreshold]))
title("训练样本异常得分分布")


nexttile
confusionchart(trueAnomaliesTest, predOCSVM,...
  Title="测试结果评估-混淆矩阵 (OCSVM)", Normalization="row-normalized");
3291374c-6b18-11ed-8abf-dac502259ad0.jpg        

小结

·优点:可以处理高维数据,适合表格/结构化数据。

·使用限制:分类变量需要先转换为虚拟变量(哑变量,Dummy Variable),ocsvm函数中可定义相关参数CategoricalPredictors ,以自动进行转换。

结果对比

在该数据集的离群值检测问题中,孤立森林、局部离群因子与单类支持向量机的结果比较接近,各自的准确度都比较理想,预测结果的重合度也超过了90%:

mean((predIF==predLOF) & (predLOF==predOCSVM))

ans = 0.9325

利用马氏距离/稳健协方差估计的方法,结果不理想,与其他三个算法的结果差异较大:

mean((predIF==predLOF) & (predLOF==predOCSVM) & (predOCSVM==predTest))

ans = 0.6196

综上,各个方法的适用范围不一,或是有特定的使用条件,在使用时需要多加留意,例如马氏距离适合符合正态分布假设的数据集,孤立森林适用于处理正常样本和异常样本差异较大的情况,各个算法计算复杂度有些许区别,可以根据实际情况选择合适的方法。

关键点回顾

·在处理异常检测问题时,首先需要充分了解您的数据

·如果您有足够的标注数据(包括异常),可使用有监督学习方法进行异常检测

·如果您的数据大部分都是正常数据,或者异常数据难以获取或标记,则可以考虑使用无监督的异常检测方法

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    182

    文章

    2963

    浏览量

    230128
  • 异常检测
    +关注

    关注

    1

    文章

    42

    浏览量

    9729
  • 机器学习
    +关注

    关注

    66

    文章

    8373

    浏览量

    132391

原文标题:机器学习应用 | 使用 MATLAB 进行异常检测(下)

文章出处:【微信号:MATLAB,微信公众号:MATLAB】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    matlab2009载地址

    作为一个标准的管理异常来处理。MATLAB R2009b新版本中,产品模块进行了一些调整,MATLAB Builder for COM的功能集成到M
    发表于 03-22 18:10

    如何使用部分异常观测数据进行异常检测

    使用部分异常观测数据进行异常检测(翻译自 Anomaly Detection with Partially Observed Anomalies)
    发表于 04-26 14:37

    如何利用MATLAB和Simulink进行S模式检测和解码?

    如何利用MATLAB和Simulink进行S模式检测和解码?
    发表于 05-18 07:17

    如何利用MATLAB和Simulink去进行S模式检测和解码?

    如何利用MATLAB和Simulink去进行S模式检测和解码?
    发表于 05-20 06:31

    基于密集人群的异常实时检测

    在密集人群场景,针对现有异常检测算法在实时性和适用性方面的不足,提出了一种基于光流特征和卡尔曼滤波的实时检测方法。该方法首先提取图像的全局光流强度作为运动特征;然后对全局光流值
    发表于 12-18 15:02 0次下载

    检测域划分的虚拟机异常检测算法

    虚拟机的正常运行是支撑云平台服务的重要条件,由于云平台下虚拟机存在数量规模大、运行环境随时间动态变化的特点,管理系统难以针对每个虚拟机进行训练数据采集以及统计模型的训练。为了提高在上述环境异常
    发表于 12-20 09:48 0次下载

    密度偏倚抽样的局部距离异常检测算法

    异常检测是数据挖掘的重要研究领域,当前基于距离或者最近邻概念的异常数据检测方法,在进行海量高维数据异常
    发表于 12-25 14:11 0次下载

    AIS数据在船舶异常行为检测

    规律和进行船舶异常行为检测提供了新的途径。本文对近年来AIS数据在船舶异常行为检测方面的研究进展和所取得的成果
    发表于 01-08 15:11 1次下载

    如何进行双侧空间窗的异常检测详细方法概述

    针对现有异常检测方法难以解释异常属性的问题,本文提出基于双侧空间窗的异常检测方法。首先,在前景检测
    发表于 01-11 15:17 3次下载
    如何<b class='flag-5'>进行</b>双侧空间窗的<b class='flag-5'>异常</b><b class='flag-5'>检测</b>详细方法概述

    什么是异常检测_异常检测的实用方法

    异常检测是一个发现“少数派”的过程,由于它们与大多数数据不一样而引起我们的注意。在几个典型场景中,异常数据能为我们关联到一些潜在的问题,如银行欺诈行为、药品问题、结构缺陷、设备故障等。这些关联关系能帮助我们挑出哪些点可能是
    的头像 发表于 06-29 09:25 1.9w次阅读

    使用MATLAB进行线性编程

    使用MATLAB进行线性编程方法。
    发表于 05-27 09:29 0次下载

    如何选择异常检测算法

    异常检测(也称为离群点检测)是检测异常实例的任务,异常实例与常规实例非常不同。这些实例称为
    的头像 发表于 10-25 09:15 1657次阅读

    使用MATLAB进行异常检测(上)

    异常检测任务,指的是检测偏离期望行为的事件或模式,可以是简单地检测数值型数据中,是否存在远超出正常取值范围的离群值,也可以是借助相对复杂的机器学习算法识别数据中隐藏的
    的头像 发表于 11-17 10:32 3430次阅读

    采用基于时间序列的日志异常检测算法应用

    新增、时段新增、时段突增、时段突降等多种异常。 然而,在实际中,日志指标时序数据并不都具有周期性,或具有其他分布特征,因此仅根据周期性进行异常检测会导致误报率高、准确率低等问题。因此如
    的头像 发表于 12-09 10:47 1592次阅读

    哈工大提出Myriad:利用视觉专家进行工业异常检测的大型多模态模型

    最近,大型多模态(即视觉和语言)模型(LMM)在图像描述、视觉理解、视觉推理等多种视觉任务上表现出了卓越的感知能力,使其成为更易于理解的异常检测的有竞争力的潜在选择。然而,现有的通用 LMM 中缺乏有关异常
    的头像 发表于 11-21 16:08 1712次阅读
    哈工大提出Myriad:利用视觉专家<b class='flag-5'>进行</b>工业<b class='flag-5'>异常</b><b class='flag-5'>检测</b>的大型多模态模型