异常检测 | MATLAB实现基于支持向量机和孤立森林的数据异常检测(结合t-SNE降维和DBSCAN聚类)

异常检测 | MATLAB实现基于支持向量机和孤立森林的数据异常检测(结合t-SNE降维和DBSCAN聚类)

目录

    • 异常检测 | MATLAB实现基于支持向量机和孤立森林的数据异常检测(结合t-SNE降维和DBSCAN聚类)
      • 效果一览
      • 基本介绍
      • 模型准备
      • 模型设计
      • 参考资料

效果一览

1
2
3

基本介绍

提取有用的特征,机器学习通常可以在少得多的数据上为您提供与深度学习相当或更好的结果。与在少得多的数据上的深度学习相比,可以获得可比或更好的结果。然后,我们将SVM、孤立森林(R2021b 中的新功能)、稳健协方差和马氏距离、DBSCAN 聚类方法应用于异常检测:
在该数据上, SVM 的性能最好,孤立森林可以接受,而马氏距离效果不佳。

模型准备

虽然深度学习需要大数据集,但机器学习方法需要的数据要少得多。机器健康并产生“正常”数据。 通常,可以使用的“异常”数据要少得多,但大多数异常检测方法都假设:主要拥有正常数据。

load("FeatureSmall.mat");
rng;% show distribution in this small data set
st = groupcounts(featureSmall,"label")
outlierFraction = st.Percent(1)/100;    % remember fraction of anomalies in data% divide subset into train and (held out) test
idxSmall = cvpartition(featureSmall.label,'holdout',0.2);
featSmallTrain = featureSmall(idxSmall.training,:);
featSmallTest = featureSmall(idxSmall.test,:);
trueAnomaliesTest = featSmallTest.label;

4

模型设计

  • 监督方法:训练分类器
    原始数据集是相当平衡的,在“之后”和“之前”维护的相同顺序样本中,代表正常和异常的操作条件。 对于在这两种情况下都有大量标记数据的用例,可以简单地应用标准的监督学习并构建分类器。 下图说明了可用标记数据量与一些可能的异常检测方法之间的关系。
    5
  • 对于这个数据集,我们位于适合监督学习的右上象限。 几种机器学习算法都取得了不错的分类准确率——说明我们之前提取的特征相当不错。 下面我们展示了验证准确性,以及最佳模型的混淆矩阵,即树集成。
    6
    7
  • 对于这个例子的其余部分,为了现实起见,我们将通过从训练集中删除“之前”数据来假装我们主要有正常数据可用。 然后我们可以演示如何应用右下象限中提到的方法:只训练正常数据,然后尝试识别异常。
  • 异常检测的统计和机器学习方法,使用 SVM 检测异常
    支持向量机是强大的分类器,它们的变体训练仅对“正常”数据进行建模,并且可以很好地识别异常。
% identify subset of "normal" (healthy) data in training 
healthyIdx = featSmallTrain.label=="Normal";
trainHealthy = featSmallTrain(healthyIdx,2:13);   % can safely skip labels column since we only have one class
trainHealthyN = size(trainHealthy,1);% train one-class SVM. On this data, training just on the "normal" (healthy) data works better
mdlSVM = fitcsvm(trainHealthy,ones(trainHealthyN,1),'Standardize',true,'OutlierFraction',0);% this variant trains on all data (including anomalies), with the estimated fraction
%mdlSVM = fitcsvm(featSmallTrain(:,2:13),ones(size(featSmallTrain,1),1),'Standardize',true,'OutlierFraction',outlierFraction);% apply to "small" test data (which has both anomalies and healthy data)
[~,scoreSVM] = predict(mdlSVM,featSmallTest(:,2:13));
isanomalySVM = scoreSVM<0;
predSVM = categorical(isanomalySVM, [1, 0], ["Anomaly", "Normal"]);confusionchart(trueAnomaliesTest,predSVM,Title="Anomaly Detection with One-class SVM",Normalization="row-normalized");

8

  • 我们可以看到 SVM 表现良好,所有异常样本都被识别出来,只有 4% 的“健康”样本被误判。
  • 使用孤立森林森林检测异常,孤立森林森林的决策树将每个观察值隔离在一片叶子中。 一个样本经过多少次决策才能到达其叶子节点是衡量将其与其他样本隔离开来的复杂程度。 特定样本的树的平均深度用作它们的异常分数,并由 iforest 返回。
% train on normal (healthy) data only. Need to tune the ContimationFraction!
[mdlIF,~,scoreTrainIF] = iforest(trainHealthy,'ContaminationFraction',0.05);[isanomalyIF,scoreTestIF] = isanomaly(mdlIF,featSmallTest(:,2:13));
predIF = categorical(isanomalyIF, [1, 0], ["Anomaly", "Normal"]);confusionchart(trueAnomaliesTest,predIF,Title="Anomaly Detection with Isolation Forest",Normalization="row-normalized");

9

  • 在这个数据上,孤立森林的表现不如SVM,但它在其他数据集上的表现优于其他方法而变得流行。
  • 为了更好地了解孤立森林的工作原理,可视化其异常分数的分布可能会有所帮助。
%To better understand how the isolation forest works, it can be helpful to visualize the distribution of its anomaly scores.
% visualize the anomaly score distributions for train vs test 
figure;
histogram(scoreTestIF,Normalization="probability");
hold on
histogram(scoreTrainIF,Normalization="probability");
xline(mdlIF.ScoreThreshold,"k-", join(["Threshold =" mdlIF.ScoreThreshold]))
legend("Test data","Training data",Location="southeast")
title("Histograms of Anomaly Scores for Isolation Forest")
hold off

11

  • 训练和测试数据分布的差异在于后者包含一些“异常”数据——而训练没有,我们将阈值设置得恰到好处,以正确识别大部分异常数据。
  • 使用稳健协方差检测异常,作为检测异常的统计方法,可以估计稳健的协方差(和均值),然后将异常识别为位于分布的边缘(异常值)。 稳健的估计器处理包含异常值并偏离多元正态性假设的数据。
featSmallTrainM = table2array(featSmallTrain(:,2:13));    % robustcov expects input as matrix, not table
featSmallTestM = table2array(featSmallTest(:,2:13)); % compute robust covariance on both normal and (typically only a little)
% anomalous data - which is not the case for this data!
[sigma,mu,mahalDistRobust,~] = robustcov(featSmallTrainM, OutlierFraction=outlierFraction);
sigRobustThresh = sqrt(chi2inv(1-outlierFraction,size(featSmallTrainM,2)));% identify anomalies on new (test) data with Mahalanobis distance
scoreTestMahal = pdist2(featSmallTestM,mu,"mahalanobis",sigma);
isanomalyMahal = scoreTestMahal > sigRobustThresh;
predMahal = categorical(isanomalyMahal, [1, 0], ["Anomaly", "Normal"]);confusionchart(trueAnomaliesTest,predMahal,Title="Anomaly Detection with Mahalanobis / Robust Covariance",Normalization="row-normalized");

12

  • 稳健协方差在该数据上效果不佳.
  • 可视化各种异常检测方法,可视化可以帮助解释分类方法为何有效以及何时无效,这也适用于异常检测。 如果您正在处理多个维度,则必须在可视化之前降低维度。 压缩多个维度的一种方便方法是随机邻域嵌入 tsne。 t-SNE 倾向于将数据分组到集群中,因为它最小化了二维空间中的 Kullback-Leibler 散度,但不要过度解释它们:这些分组并不总是存在于原始高维数据中。
% use t-SNE to reduce the 12 features into a two-dimensional space
T = tsne(featSmallTestM);% compare the various anomaly detection methods visually, starting with
% "ground truth" (labels)
figure;
tiledlayout(2,2)
nexttile
gscatter(T(:,1),T(:,2),trueAnomaliesTest,"kr",".o",[],"off");
title("Ground Truth")
legend("Normal","Anomalous");
nexttile(2)
gscatter(T(:,1),T(:,2),predIF,"kr",".o",[],"off")
title("Isolation Forest")
nexttile(3)
gscatter(T(:,1),T(:,2),predSVM,"kr",".o",[],"off")
title("One-class SVM")
nexttile(4)
gscatter(T(:,1),T(:,2),predMahal,"kr",".o",[],"off")
title("Robust Mahalanobis Distance")

13

  • 我们可以看到,上方区域的异常数据簇和左下方的正常数据簇,大多被一类SVM和隔离森林正确识别,而没有被马氏距离分开 (至少在t-SNE转换 12 个特征的二维空间中)。
  • 应用聚类检测异常,还可以应用聚类来识别数据中的组,并将这些组中的哪些组与正常样本和异常样本相关联。 这在视觉上更容易完成,所以让我们使用 t-SNE 总结原始 12 个特征的两个维度,并应用像 dbscan 这样的基于距离的聚类方法。 它需要一些实验来找到距离参数 epsilon 和最小集群大小的正确设置。
trainSmallSNE = tsne(featSmallTrainM);
mdlDB = dbscan(trainSmallSNE,5,20);
figure
gscatter(trainSmallSNE(:,1),trainSmallSNE(:,2),mdlDB);

14

参考资料

[1] https://blog.csdn.net/kjm13182345320/article/details/124864369
[2] https://blog.csdn.net/kjm13182345320/article/details/127896974?spm=1001.2014.3001.5502

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

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

相关文章

Java的三种代理模式实现

代理模式的定义&#xff1a; Provide a surrogate or placeholder for another object to control access to it.&#xff08;为其他对象提供一种代理以控制对这个对象的访问。&#xff09; 简单说&#xff0c;就是设置一个中间代理来控制访问原目标对象&#xff0c;达到增强原…

领域驱动架构(DDD)建模

一、背景 常见的软件开发方式是拿到产品需求后&#xff0c;直接考虑数据库中表应该如何设计&#xff0c;这种方式已经将设计与业务需求脱节&#xff0c;而更多的是直接考虑应该如何实现了&#xff0c;这有点本末倒置。而DDD是从领域(问题域)为出发点进行的设计方法。 领域驱动…

记录 | centos源码编译bazel

tensorflow的源码编译依赖于 bazel 这里进行 bazel 的源码编译 1、安装依赖 sudo yum install -y java-11-openjdk sudo yum install -y java-11-openjdk-devel sudo yum install -y protobuf-compiler zip unzip2、知悉要安装的 bazel 的版本 务必安装受支持的 Bazel 版本…

Linux下c开发

编程环境 Linux 下的 C 语言程序设计与在其他环境中的 C 程序设计一样&#xff0c; 主要涉及到编辑器、编译链接器、调试器及项目管理工具。编译流程 编辑器 Linux 中最常用的编辑器有 Vi。编译连接器 编译是指源代码转化生成可执行代码的过程。在 Linux 中&#xff0c;最常用…

网络安全行业大模型调研总结

随着人工智能技术的发展&#xff0c;安全行业大模型SecLLM&#xff08;security Large Language Model&#xff09;应运而生&#xff0c;可应用于代码漏洞挖掘、安全智能问答、多源情报整合、勒索情报挖掘、安全评估、安全事件研判等场景。 参考&#xff1a; 1、安全行业大模…

uniapp 打开文件管理器上传(H5、微信小程序、android app三端)文件

H5跟安卓APP 手机打开的效果图&#xff1a; Vue页面&#xff1a; <template><view class"content"><button click"uploadFiles">点击上传</button></view> </template><script>export default {data() {return…

web:[GXYCTF2019]BabyUpload(文件上传、一句话木马、文件过滤)

题目 页面显示为文件上传 随便上传一个文件看看 上传一个文本文件显示 上传了一个图片显示 上传包含一句话木马的图片 上传了一个包含php一句话木马的文件&#xff0c;显示如上 换一个写法 上传成功 尝试上传.htaccess&#xff0c;上传失败&#xff0c;用抓包修改文件后缀 …

LangChain 23 Agents中的Tools用于增强和扩展智能代理agent的功能

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

Apache Flink(四):Flink 其他实时计算框架对比

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 根据前文描述我们知道Flink主要处…

LNMP网站架构分布式搭建部署(编译安装)

目录 一、数据库编译安装 二、nginx编译安装 三、php编译安装 三、通过nfs将三台不同的主机资源共享 四、基础测试 五、完成WordPress站点部署 六、完成bbs论坛站点部署 一、数据库编译安装 1、先下载安装包到/opt目录中&#xff0c;最好选择mysql-boost-5.7.44.tar.gz版…

步进电机驱动芯片TB6600HG部分翻译

有些参数没看懂。一边设计&#xff0c;一边修正。 目录 1.芯片梗概 2.引脚配置 1)引脚含义 2)内部逻辑 3.功能详解 1&#xff09;励磁模式设置 2&#xff09;功能设置 3&#xff09;初始模式 4&#xff09;100% 电流设置(电流值) 5&#xff09;OSC 6&#xff09;衰减…

python 使用 AppiumService 类启动appium server

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类&#xff0c;可以很方便的通过该类来管理Appium服务器的启动和停止。 二、操作步骤 import osfrom appium.webdriver.appium_service import AppiumService as OriginalServerfrom libs import pathclass AppiumSer…

windows判断exe应用程序是否在使用的bat脚本

脚本 REM 查询进程是否存在 tasklist|findstr /i "mysqld.exe">nul &&echo y >2.log ||echo n >2.log REM 读取文本内容赋值给变量 set /P resu<2.log if %resu% y (echo process in use ) else (echo process not in use )我们已mysqld.exe…

C++ day58 每日温度 下一个更大元素

题目1&#xff1a;739 每日温度 题目链接&#xff1a;每日温度 对题目的理解 temperature[i]表示每天的温度&#xff0c;返回数组answer&#xff0c;answer[i]指对于第i天&#xff0c;下一个更高温度最近出现在几天后&#xff0c;如果气温在这之后都不会升高&#xff0c;用0…

720度vr虚拟家居展厅提升客户的参观兴致

VR虚拟展厅线上3D交互展示的优势有以下几点&#xff1a; 打破了场馆的展示限制&#xff0c;可展示危险性制品、珍贵稀有物品、超大型设备等&#xff0c;同时提供了更大的展示空间和更丰富的展示内容。 可提供企业真实环境的实时VR全景参观&#xff0c;提升潜在客户信任度。 提供…

JAVA导出PDF(一)

思路一&#xff1a;直接导出pdf 使用freemarker和itext把html转pdf&#xff0c;存在中文乱码&#xff0c;宋体不识别&#xff0c;需下载simsun.ttc字体&#xff0c;空白占位符不识别等等问题&#xff0c;对前端依赖性较大&#xff0c;不推荐&#xff1b; 适用范围&#xff1a;…

批量操作Excel的四个方法(求和、移动、对比、合并)

Excel文件肯定少不了保存大量数据&#xff0c;那么在使用excel的时候会不会要大批量数据进行操作&#xff1f;今天分享4个快速使用excel操作的小技巧。希望能够帮大家提高excel制作效率。 技巧一&#xff1a;快速求和 当你想要分别得到行列的总和&#xff0c;我们可以选中表格…

看图学源码之 CopyOnWriteArrayList 源码分析

基本简介&#xff1a; 是Java中的一个线程安全的List实现&#xff0c;也是ArrayList 的安全版本&#xff0c;所以就不会有ArrayList 的并发修改异常 的问题产生了 原理 每次在对 List 进行修改时&#xff0c;创建一个新的副本&#xff08;即拷贝&#xff09;&#xff0c;而不…

计算机组成原理—存储系统

文章目录 存储系统分层RAM存储器DRAM刷新地址线复用 ROM存储器疑问 提升主存访问速度双端口RAM多模块存储器单体多字存储器多体并行存储器 主容量扩展cache高速缓存器cache与主存映射&#xff08;读策略&#xff09;替换策略cache写策略 存储方式页式存储器虚拟存储器 计组真的…