机器学习之非监督学习(二)异常检测(基于高斯概率密度)

机器学习之非监督学习(二)异常检测(基于高斯概率密度)

  • 0. 文章传送
  • 1.案例引入
  • 2.高斯正态分布
  • 3.异常检测算法
  • 4.异常检测 vs 监督学习
  • 5.算法优化
  • 6.代码实现

0. 文章传送

机器学习之监督学习(一)线性回归、多项式回归、算法优化[巨详细笔记]
机器学习之监督学习(二)二元逻辑回归
机器学习之监督学习(三)神经网络基础
机器学习之监督学习(四)决策树和随机森林
机器学习之实战篇——预测二手房房价(线性回归)
机器学习之实战篇——肿瘤良性/恶性分类器(二元逻辑回归)
机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)
机器学习之非监督学习(一)K-means 聚类算法
机器学习之实战篇——图像压缩(K-means聚类算法)

1.案例引入

假设你是飞机生产商,生产了一批飞机发动机,并记录其两个特征x1(heat)和x2(vibration)。由于我们的生产技术过硬,可以相信其中大多数发动机能够正常工作。从机器学习的角度出发,那么我们能否充分利用已有的发动机数据,用来检测后续生产的发动机是否异常呢?这就是典型的异常监测任务。

如下图所示,可以根据数据建立概率密度分布模型,对于新的测试数据,若其位置对应的概率小于某个设定阈值,则可将其标记为‘异常。’
在这里插入图片描述
再举一个例子,数据中心可以通过用户电脑工作的实时数据(例如内存使用、CPU使用率)监测用户电脑是否异常,发现潜在的风险,例如计算机被攻击或感染恶意软件。一旦检测到异常,系统可以自动提醒用户注意,或向 IT 支持团队发送警报进行进一步检查,以保障用户体验和数据安全性。
在这里插入图片描述

2.高斯正态分布

在这里插入图片描述
高斯正态分布(Gaussian Normal Distribution)是概率统计中最重要和最常用的分布之一。它在许多自然现象中都有广泛的应用。以下是关于高斯正态分布的详细介绍:

  1. 定义
    高斯正态分布是一个连续概率分布,其概率密度函数(PDF)由以下公式给出:

p ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 p(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{(x - \mu)^2}{2\sigma^2}} p(x)=2π σ1e2σ2(xμ)2

其中:
μ 是均值(mean),决定了分布的中心位置。
σ 是标准差(standard deviation),影响分布的宽度和形状。
σ^2是方差(variance),表示数据的离散程度。

  1. 特性
    对称性:高斯正态分布是一个对称分布,均值 \muμ 是其对称中心。
    钟形曲线:概率密度函数图形呈现为钟形曲线,具有单峰性,意味着大多数数据集中在均值附近。
    68-95-99.7法则:在高斯分布中,约68%的数据点位于均值的一个标准差内 ( μ − σ 到 μ + σ ) (\mu - \sigma到 \mu + \sigma) μσμ+σ,约95%位于两个标准差内,99.7%位于三个标准差内。
    渐近性:分布在无限远处趋向于零,但永远不会等于零。
  2. 标准正态分布
    标准正态分布是特殊的高斯分布,其均值为0,标准差为1。其概率密度函数为:

p ( z ) = 1 2 π e − z 2 2 p(z) = \frac{1}{\sqrt{2\pi}} e^{-\frac{z^2}{2}} p(z)=2π 1e2z2

其中 z 是标准分数(z-score),定义为: z = x − μ σ z = \frac{x - \mu}{\sigma} z=σxμ.

通过标准化,可以将任意高斯分布转换为标准正态分布。

关于多元高斯分布,参照下图:
在这里插入图片描述

3.异常检测算法

在异常检测中,我们需要建立概率密度分布模型,通常假设每个特征满足正态分布。
x i ~ N ( μ i , σ i 2 ) , p ( x i ) = 1 2 π σ i e − ( x − μ i ) 2 2 σ i 2 x_i~N(\mu_i,\sigma_i^2),p(x_i)=\frac{1}{\sqrt{2\pi}\sigma_i}e^{-\frac{(x-\mu_i)^2}{2\sigma_i^2}} xiN(μi,σi2),p(xi)=2π σi1e2σi2(xμi)2
其中均值和标准差(无偏估计)的计算公式为:
μ i = 1 m ∑ k = 1 m x i ( k ) , σ i = 1 m − 1 ∑ k = 1 m ( μ i − x i ( k ) ) 2 \mu_i=\frac{1}{m}\sum_{k=1}^{m}x_i^{(k)},\sigma_i=\sqrt{\frac{1}{m-1}\sum_{k=1}^{m}(\mu_i-x_{i}^{(k)})^2} μi=m1k=1mxi(k),σi=m11k=1m(μixi(k))2
考虑多个特征,理想情况是考虑各个特征之间相互独立,则由概率公式可得
p ( x ) = ∏ j p ( x j ; μ j , σ j 2 ) p(x)=\prod_j{p(x_j;\mu_j,\sigma_j^2)} p(x)=jp(xj;μj,σj2)

尽管通常情况下各个特征之间不完全独立,但事实表明这种计算方式能取得较好的模型效果。

设置异常检测的临界概率(阈值) ϵ \epsilon ϵ,对于待检测样本,计算其概率p(x)并与 ϵ \epsilon ϵ比较,如果p(x)< ϵ \epsilon ϵ,则将其检测为异常样本。

在异常检测中,如何确定合适的阈值 ϵ \epsilon ϵ?在前面的系列文章中我们提到,对于参数选择,一种有效方式是引入验证集,通过验证效果来决定理想的参数。

如下图所示,假设我们已知有10000台正常发动机和20台异常发动机,这时可以选择6000台正常发动机作为训练集(符合算法假设);然后选择2000台正常发动机和10台异常发动机作为验证集;剩下的部分作为测试集。

由于异常检测任务归类于分类问题,因此评估的参数包括混淆矩阵、召回率、精确率、F1-score等等。通过选取不同的阈值,比较验证效果,来选择最优阈值。
同样的,测试集上的表现可以用这些分类指标进行评估。
在这里插入图片描述

4.异常检测 vs 监督学习

异常检测属于非监督学习,训练集中的数据均未带标签(默认正常),但我们可能拥有少量带标签的数据(例如发动机案例中已知少量异常发动机),这时候使用监督学习分类算法也可行,那如何在监督学习和基于概率的异常检测之间进行选择呢?

一般来说,异常检测通常适用的情况如下:
①我们只有少量异常数据和大量正常数据
②异常种类很多,未来新的样本可能出现新的异常情况,算法很难从已有数据中捕获足够的异常信息。

监督学习更适用的情况如下:
①我们有大量的正常和异常数据
②异常种类可枚举或未来新的样本呈现的异常情况具有重复性。
在这里插入图片描述
适合两种算法的典型场景如下图所示:
在这里插入图片描述

5.算法优化

在异常检测任务中,选取和构建合适的特征非常重要,因为基本假设是特征满足正态分布,因此对于偏离正态分布较大的特征,我们希望通过特征处理,将其分布趋近于正态分布。

如下图所示,绘制了某个特征的直方图,可以看到分布曲线向左偏移,偏离正态分布较大。这时候可以通过取对数函数 l o g ( x + c ) log(x+c) log(x+c),或取幂函数 x c ( 0 < c < 1 ) x^c(0<c<1) xc(0<c<1),调整分布接近正态分布。这一过程可以通过编程尝试不同参数c实现。
在这里插入图片描述
异常检测中另一种有效的优化方法是通过误差分析引入新的特征。例如在线上交易安全检测器中,我们选取了特征x1(表示交易量)作为特征,训练好模型后进行验证时发现一个错误的案例,发现该案例用户打字速度异常快,因此可以引入新的特征x2:打字速度。这样建立的模型取得了更好的分类效果。
在这里插入图片描述
再比如在电脑检测案例中,如果发现一台电脑具有很的高CPU使用率,却使用了很少的网络流量,基于此异常情况可以构建新的特征(如下图,可以取比值)。
在这里插入图片描述
特征工程的手段灵活而丰富,但最终的目的都是提升模型的检测能力,在验证集和测试集中都能取得满意的表现。

6.代码实现

计算各个特征高斯分布的均值与标准差函数

def estimate_gaussian(X): """Calculates mean and variance of all features in the datasetArgs:X (ndarray): (m, n) Data matrixReturns:mu (ndarray): (n,) Mean of all featuresvar (ndarray): (n,) Variance of all features"""m, n = X.shapemu=np.average(X,axis=0)var=np.var(X,axis=0,ddof=0) #无偏估计return mu, var

计算所有输入数据对应的概率密度

def multivariate_gaussian(X, mu, var):"""Computes the probability density function of the examples X under the multivariate gaussian distribution with parameters mu and var. If var is a matrix, it istreated as the covariance matrix. If var is a vector, it is treatedas the var values of the variances in each dimension (a diagonalcovariance matrix"""k = len(mu)if var.ndim == 1:var = np.diag(var)X = X - mup = (2* np.pi)**(-k/2) * np.linalg.det(var)**(-0.5) * \np.exp(-0.5 * np.sum(np.matmul(X, np.linalg.pinv(var)) * X, axis=1))return p

根据F1-score选择最佳阈值(阈值取值范围从 p m i n 到 p m a x , 取 1000 个值 p_{min}到p_{max},取1000个值 pminpmax,1000个值)

def select_threshold(y_val, p_val): """Finds the best threshold to use for selecting outliers based on the results from a validation set (p_val) and the ground truth (y_val)Args:y_val (ndarray): Ground truth on validation setp_val (ndarray): Results on validation setReturns:epsilon (float): Threshold chosen F1 (float):      F1 score by choosing epsilon as threshold""" best_epsilon = 0best_F1 = 0F1 = 0step_size = (max(p_val) - min(p_val)) / 1000for epsilon in np.arange(min(p_val), max(p_val), step_size):### START CODE HERE ### y_pred=(p_val < epsilon)tp=np.sum((y_val==1)&(y_pred==1))fp=np.sum((y_val==0)&(y_pred==1))fn=np.sum((y_val==1)&(y_pred==0))prec=tp/(tp+fp)rec=tp/(tp+fn)F1=(2*prec*rec)/(prec+rec)### END CODE HERE ### if F1 > best_F1:best_F1 = F1best_epsilon = epsilonreturn best_epsilon, best_F1

实例用法

# Estimate the Gaussian parameters
mu, var = estimate_gaussian(X_train)# Evaluate the probabilites for the training set
p = multivariate_gaussian(X_train, mu, var)# Evaluate the probabilites for the cross validation set
p_val = multivariate_gaussian(X_val, mu, var)# Find the best threshold
epsilon, F1 = select_threshold(y_val, p_val)# Compute the probabilities and detection results for the testing set
p_test=multivariate_gaussian(X_test,mu,var)
y_test=(p_test<epsilon).astype('int')

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C语言中数组和字符串的联系

一、C语言中&#xff0c;数组和字符串 1、C语言中&#xff0c;定义一个数组后&#xff0c;数组名保存的是这个数组的首地址。类似一个指向数组第一个元素的指针&#xff0c;但是这个指针不能重新指向。2、字符串在C语言中是通过字符数组来实现的&#xff0c;也就是说字符串还是…

【小沐学CAD】3ds Max常见操作汇总

文章目录 1、简介2、二次开发2.1 C 和 3ds Max C SDK2.2 NET 和 3ds Max .NET API2.3 3ds Max 中的 Python 脚本2.4 3ds Max 中的 MAXScript 脚本 3、快捷键3.1 3Dmax键快捷键命令——按字母排序3.2 3dmax快捷键命令——数字键3.3 3dmax功能键快捷键命令3.4 3Dmax常用快捷键——…

Elasticsearch 完整格式的 URL 进行分词,有什么好的解决方案吗?

1、问题描述 我想对完整格式的 url 进行分词&#xff0c;请问有什么好的解决方案吗&#xff1f; 比如&#xff1a;https://www.abc.com/any/path?param_1some&param-2other#title 看了官方的分词器&#xff0c;感觉没啥合适的? 预处理的话&#xff0c;又不知道该怎么处理…

Unity对象池的高级写法 (Plus优化版)

唐老师关于对物体分类的OOD的写法确实十分好&#xff0c;代码也耦合度也低&#xff0c;但是我有个简单的写法同样能实现一样的效果&#xff0c;所以我就充分发挥了一下主观能动性 相较于基本功能&#xff0c;这一版做出了如下改动 1.限制了对象池最大数量&#xff0c;多出来的…

C++11 可变的模板参数

前言 本期我们接着继续介绍C11的新特性&#xff0c;本期我们介绍的这个新特性是很多人都感觉抽象的语法&#xff01;它就是可变的模板参数&#xff01; 目录 前言 一、可变的模板参数 1.1可变的参数列表 1.2可变的参数包 1.3可变参数包的解析 • 递归展开解析 • 逗号…

微服务Docker相关指令

1、拉取容器到镜像仓库 docker pull xxx //拉取指令到 镜像仓库 例如 docker pull mysql 、docker pull nginx docker images //查看镜像仓库 2、删除资源 2.1、删除镜像仓库中的资源 docker rmi mysql:latest //删除方式一&#xff1a;格式 docker rmi 要…

【解密 Kotlin 扩展函数】扩展函数的创建(十六)

导读大纲 1.1 为第三方的类添加方法: 扩展函数 1.1 为第三方的类添加方法: 扩展函数 Kotlin 的主题之一是与现有代码的平滑集成 即使是纯 Kotlin 项目,也是构建在 Java 库之上的 如 JDK、Android 框架和其他第三方框架 而当你将 Kotlin 集成到 Java 项目中时 你还要处理尚未或不…

python爬虫:将知乎专栏文章转为pdf

欢迎关注本人的知乎主页~ 实现思路 用户输入专栏ID&#xff1a; 代码首先提示用户输入一个知乎专栏的ID&#xff0c;默认值为 c_1747690982282477569。输入的ID用于构建API请求的URL。 发送HTTP请求&#xff1a; 使用 requests.get() 向知乎API发送GET请求&#xff0c;获取指定…

【QGIS入门实战精品教程】6.1:QGIS根据属性条件查询数据(SQL表达式)

文章目录 一、字段过滤二、高级过滤(表达式)一、字段过滤 对于单个字段的查询,可以采用字段过滤,例如,从县区数据中,根据NAME字段,查找出县级市玉门市。操作为:右键县区→打开属性表: 点击左下角,选择name字段。 输入玉门市,回车,选择查找除的属性表记录,此时图斑…

【Linux】入门【更详细,带实操】

Linux全套讲解系列&#xff0c;参考视频-B站韩顺平&#xff0c;本文的讲解更为详细 目录 1、课程内容 2、应用领域 3、概述 4、 Linux和Unix 5、VMware15.5和CentOS7.6安装 6、网络连接三种方式 7、虚拟机克隆 8、虚拟机快照 9、虚拟机迁移删除 10、vmtools 11、目录…

set-ExecutionPolicy RemoteSigned 提示不是内部或外部命令,也不是可运行的程序或批处理文件

这个错误一般发生在使用命令提示符或者PowerShell窗口中找不到set-ExecutionPolicy RemoteSigned。如果你想在命令提示符或者PowerShell窗口运行set-ExecutionPolicy RemoteSigned&#xff0c;你需要搜索打开Window PowerShell ISE&#xff0c;并以管理员身份打开&#xff0c;输…

基于微信小程序的美食外卖管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Tomcat系列漏洞复现

CVE-2017-12615——Tomcat put⽅法任意⽂件写⼊漏洞 漏洞描述 当 Tomcat运⾏在Windows操作系统时&#xff0c;且启⽤了HTTP PUT请求⽅法&#xff08;例如&#xff0c;将 readonly初始化参数由默认值设置为false&#xff09;&#xff0c;攻击者将有可能可通过精⼼构造的攻击请求…

身份安全风险不断上升:企业为何必须立即采取行动

在推动安全AI 模型的过程中&#xff0c;许多组织已转向差异隐私。但这种旨在保护用户数据的工具是否阻碍了创新&#xff1f; 开发人员面临一个艰难的选择&#xff1a;平衡数据隐私或优先考虑精确结果。差分隐私可以保护数据&#xff0c;但通常以牺牲准确性为代价——对于医疗保…

某省公共资源交易中心爬虫逆向分析

目标网站 aHR0cHM6Ly95Z3AuZ2R6d2Z3Lmdvdi5jbi8jLzQ0L3NjenQteHEvP3VzZXJJZD02NzM4OTg2MzkyNjA3NzAzMDQmcm93SWQ9NTI1MDYyMDI2ODg0NzE2NTQ0JnRpbWU9MjAwOC0xMS0yNiZjZXJ0aWZpY2F0ZU5vPTkxNDQwOTA0NjgyNDI2MzU4QyZjZXJ0aWZpY2F0ZVR5cGU9Mjg 一、抓包分析 请求头参数加密 二、…

【学习笔记】手写 Tomcat 五

目录 一、优化 Servlet 创建一个抽象类 继承抽象类 二、三层架构 业务逻辑层 数据访问层 1. 在 Dao 层操作数据库 2. 调用 Dao 层&#xff0c;实现业务逻辑功能 3. 调用 Service 层&#xff0c;响应数据 测试 三、数据库连接池 1. 手写数据库连接池 2. 创建数据库…

2024年9月19日---关于ES6(2)

五 异步编程 5.1 回调函数 5.1.1 概念 回调函数(callback function)&#xff0c;当一个函数作为参数传入另一个参数中&#xff0c;并且它不会立即执行&#xff0c;只有当满足一定条件后该函数才可以执行&#xff0c;这种函数就称为回调函数。 你可以将其理解为 回头再调用的…

GNU编译器(GCC):编译的4个过程及.elf、.list、.map文件功能说明

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…

开源 AI 智能名片 S2B2C 商城小程序与营销工具的快速迭代

摘要&#xff1a;本文以开源 AI 智能名片 S2B2C 商城小程序为研究对象&#xff0c;探讨在营销工具快速迭代的背景下&#xff0c;该小程序如何借鉴以拼多多为代表的“小程序拼团”、以蘑菇街为代表的“小程序直播”、以花点时间为代表的“小程序按月订花”等经典案例&#xff0c…

数据集-目标检测系列-摩托车检测数据集 motorcycle >> DataBall

数据集-目标检测系列-摩托车检测数据集 motorcycle >> DataBall 数据集-目标检测系列-摩托车&#xff08;motorcycle&#xff09;检测数据集 数据量&#xff1a;1W 想要进一步了解&#xff0c;请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方式&#xf…