吴恩达471机器学习入门课程3第1周——异常检测

news2024/9/20 20:51:52

异常检测

    • 1 导包
    • 2 - 异常检测
      • 2.1 问题陈述
      • 2.2 数据集
        • 可视化您的数据
      • 2.3 高斯分布
      • 2.2.1 估计高斯分布的参数
      • 2.2.2 选择阈值 ϵ \epsilon ϵ
      • 2.4 高维数据集
        • 异常检测

实现异常情况检测算法,并应用它来检测网络上的故障服务器。

1 导包

import numpy as np
import matplotlib.pyplot as plt
from utils import *
from public_tests import *
%matplotlib inline

2 - 异常检测

2.1 问题陈述

在此练习中,您将实现一个异常检测算法来检测服务器计算机中的异常行为。

数据集包含两个特征 -

  • 吞吐量(mb / s)和
  • 每个服务器响应的延迟(ms)。

当您的服务器正在运行时,您收集了 m = 307 m=307 m=307个例子,记录它们的行为,因此有一个未标记数据集 { x ( 1 ) , … , x ( m ) } \{x^{(1)}, \ldots, x^{(m)}\} {x(1),,x(m)}

  • 您怀疑其中绝大多数示例是服务器正常运行的“正常”(非异常)示例,但也可能有一些服务器在此数据集中表现异常。

您将使用高斯模型来检测数据集中的异常示例。

  • 首先,您将从一个二维数据集开始,以便您可以可视化算法正在执行的操作。
  • 在该数据集上,您将拟合高斯分布,然后找到概率非常低的值,因此可以被视为异常。
  • 之后,您将把这个异常检测算法应用到具有许多维度的更大数据集上。

2.2 数据集

您将首先加载此任务的数据集。

  • 下面显示的load_data()函数将数据加载到变量X_trainX_valy_val
    • 您将使用X_train拟合高斯分布
    • 您将使用X_valy_val作为交叉验证集来选择阈值并确定异常与正常示例。
X_train, X_val,y_val = load_data()
X_train[:5]
array([[13.04681517, 14.74115241],
       [13.40852019, 13.7632696 ],
       [14.19591481, 15.85318113],
       [14.91470077, 16.17425987],
       [13.57669961, 14.04284944]])
X_val[:5]
array([[15.79025979, 14.9210243 ],
       [13.63961877, 15.32995521],
       [14.86589943, 16.47386514],
       [13.58467605, 13.98930611],
       [13.46404167, 15.63533011]])
y_val[:5]
array([0, 0, 0, 0, 0], dtype=uint8)

可视化您的数据

在开始任何任务之前,通过可视化数据通常很有用。

  • 对于此数据集,由于它只有两个要绘制的属性(吞吐量和延迟),因此可以使用散点图来可视化数据(X_train)。
print(f"X_train的最大值{np.max(X_train)},最小值{np.min(X_train)}")
X_train的最大值24.35040724802435,最小值4.126232224310076
plt.scatter(X_train[:, 0], X_train[:, 1], marker='x', c='b')
plt.title("The first dataset")
plt.ylabel('Throughput (mb/s)')
plt.xlabel('Latency (ms)')
plt.axis([0, 30, 0, 30])
plt.show()

png

2.3 高斯分布

要执行异常检测,首先需要拟合数据的分布模型。

  • 给定训练集 { x ( 1 ) , . . . , x ( m ) } \{x^{(1)}, ..., x^{(m)}\} {x(1),...,x(m)},你想要估计每个特征 x i x_i xi 的高斯分布。

  • 回忆一下,高斯分布由以下公式给出:

    p ( x ; μ , σ 2 ) = 1 2 π σ 2 exp ⁡ − ( x − μ ) 2 2 σ 2 p(x ; \mu,\sigma ^2) = \frac{1}{\sqrt{2 \pi \sigma ^2}}\exp^{ - \frac{(x - \mu)^2}{2 \sigma ^2} } p(x;μ,σ2)=2πσ2 1exp2σ2(xμ)2

    其中 μ \mu μ 是均值, σ 2 \sigma^2 σ2 控制方差。

  • 对于每个特征 i = 1 … n i=1\ldots n i=1n,你需要找到适合第 i i i 维度 { x i ( 1 ) , . . . , x i ( m ) } \{x_i^{(1)}, ..., x_i^{(m)}\} {xi(1),...,xi(m)}(每个样本的第 i i i 维度)数据的参数 μ i \mu_i μi σ i 2 \sigma_i^2 σi2

2.2.1 估计高斯分布的参数

完成下面的 estimate_gaussian 函数来计算 X 中每个特征的均值 mu 和方差 var

可以使用以下方程来估计第 i i i 个特征的参数 ( μ i \mu_i μi, σ i 2 \sigma_i^2 σi2)。为了估计平均值,你将使用:

μ i = 1 m ∑ j = 1 m x i ( j ) \mu_i = \frac{1}{m} \sum_{j=1}^m x_i^{(j)} μi=m1j=1mxi(j)

对于方差,你将使用:

σ i 2 = 1 m ∑ j = 1 m ( x i ( j ) − μ i ) 2 \sigma_i^2 = \frac{1}{m} \sum_{j=1}^m (x_i^{(j)} - \mu_i)^2 σi2=m1j=1m(xi(j)μi)2

def estimate_gaussian(x):
    m,n = x.shape
    # 平均值
    mu = 1 / m * np.sum(x,axis=0)
    # 方差
    var = 1/ m * np.sum((x-mu)**2,axis=0)
    return mu,var

现在你已经完成了 estimate_gaussian 函数的编写,我们将可视化拟合的高斯分布的轮廓。

你应该会得到与下图类似的图形。

从你的图中可以看出,大多数样本都在最高概率的区域内,而异常样本则在概率较低的区域中。

mu, var = estimate_gaussian(X_train)
p = multivariate_gaussian(X_train,mu,var)
visualize_fit(X_train,mu,var)

png

2.2.2 选择阈值 ϵ \epsilon ϵ

现在你已经估计了高斯分布参数,可以探究哪些样本在这个分布中有非常高的概率,哪些样本具有非常低的概率。

  • 具有低概率的示例更可能是我们数据集中的异常点。
  • 确定哪些示例是异常点的一种方法是根据交叉验证集选择阈值。

在本节中,你将完成 select_threshold 函数的编写,使用交叉验证集上的 F 1 F_1 F1 分数来选择阈值 ε \varepsilon ε

  • 为此,我们将使用一个交叉验证集 { ( x c v ( 1 ) , y c v ( 1 ) ) , … , ( x c v ( m c v ) , y c v ( m c v ) ) } \{(x_{\rm cv}^{(1)}, y_{\rm cv}^{(1)}),\ldots, (x_{\rm cv}^{(m_{\rm cv})}, y_{\rm cv}^{(m_{\rm cv})})\} {(xcv(1),ycv(1)),,(xcv(mcv),ycv(mcv))},其中标签 y = 1 y=1 y=1 对应于异常示例, y = 0 y=0 y=0 对应于正常示例。
  • 对于每个交叉验证示例,我们将计算 p ( x c v ( i ) ) p(x_{\rm cv}^{(i)}) p(xcv(i))。所有这些概率 p ( x c v ( 1 ) ) , … , p ( x c v ( m c v ) ) p(x_{\rm cv}^{(1)}), \ldots, p(x_{\rm cv}^{(m_{\rm cv)}}) p(xcv(1)),,p(xcv(mcv)) 的向量将以 p_val 向量的形式传递给 select_threshold
  • 相应的标签 y c v ( 1 ) , … , y c v ( m c v ) y_{\rm cv}^{(1)}, \ldots, y_{\rm cv}^{(m_{\rm cv)}} ycv(1),,ycv(mcv) 将以相同的方式传递给该函数,存储在 y_val 向量中。

请完成以下 select_threshold 函数,以找到基于验证集 (p_val) 和真实标签 (y_val) 的结果选择异常值所使用的最佳阈值。

  • 在已提供的 select_threshold 代码中,已经有一个循环将尝试许多不同的 ε \varepsilon ε 值,并根据 F 1 F_1 F1 分数选择最佳 ε \varepsilon ε

  • 你需要实现计算使用 epsilon 作为阈值的 F1 分数的代码,并将该值放入 F1 中。

    • 回想一下,如果一个样本 x x x 具有较低的概率 p ( x ) < ε p(x) < \varepsilon p(x)<ε,那么它被分类为异常点。

    • 然后,可以通过以下方式计算精确度和召回率:
      p r e c = t p t p + f p r e c = t p t p + f n , \begin{aligned} prec&=&\frac{tp}{tp+fp}\\ rec&=&\frac{tp}{tp+fn}, \end{aligned} precrec==tp+fptptp+fntp, 其中

      • t p tp tp 是真正例(true positives)的数量:即实际标签指示为异常值,我们的算法正确地将其分类为异常值。
      • f p fp fp 是假正例(false positives)的数量:即实际标签指示为非异常值,但我们的算法错误地将其分类为异常值。
      • f n fn fn 是假负例(false negatives)的数量:即实际标签指示为异常值,但我们的算法错误地将其分类为非异常值。
    • F1 分数使用精确度( p r e c prec prec)和召回率( r e c rec rec)计算如下:
      F 1 = 2 ⋅ p r e c ⋅ r e c p r e c + r e c F_1 = \frac{2\cdot prec \cdot rec}{prec + rec} F1=prec+rec2precrec

实现提示:
为了计算 t p tp tp, f p fp fp f n fn fn,你可能可以使用矢量化实现,而不是循环遍历所有

def select_threshold(y_val, p_val):
    best_epsilon = 0
    best_F1 = 0
    F1 = 0

    step_size = (max(p_val) - min(p_val)) / 1000

    for epsilon in np.arange(min(p_val), max(p_val), step_size):


        predictions = (p_val < epsilon)
        tp = np.sum((predictions == 1) & (y_val == 1))
        fn = np.sum((predictions == 0) & (y_val == 1))
        fp = np.sum((predictions == 1) & (y_val == 0))
        # 精确率
        if (tp + fp) > 0:
            prec = tp / (tp + fp)
        else:
            prec = 0
        # 召回率
        rec = tp / (tp + fn)
        # 计算F1
        if (prec + rec) > 0:
            F1 = 2 * prec * rec / (prec + rec)
        else:
            F1 = 0
        if F1 > best_F1:
            best_F1 = F1
            best_epsilon = epsilon

    return best_epsilon, best_F1
p_val = multivariate_gaussian(X_val, mu, var)
epsilon, F1 = select_threshold(y_val, p_val)

print('Best epsilon found using cross-validation: %e' % epsilon)
print('Best F1 on Cross Validation Set: %f' % F1)
Best epsilon found using cross-validation: 8.990853e-05
Best F1 on Cross Validation Set: 0.875000

现在,我们将运行异常检测代码,并在图中圈出异常(下面的图 3)。
image-20230618194547500

2.4 高维数据集

现在,我们将在一个更加现实且更难的数据集上运行您实现的异常检测算法。

在这个数据集中,每个样本由11个特征描述,捕捉了计算服务器的许多属性。

让我们从加载数据集开始。

  • 下面显示的 load_data() 函数将数据加载到变量 X_train_highX_val_highy_val_high
    • _high 用于区分这些变量和前面部分中使用的变量
    • 我们将使用 X_train_high 来拟合高斯分布
    • 我们将使用 X_val_highy_val_high 作为交叉验证集来选择阈值并确定异常和正常样本
X_train_high, X_val_high, y_val_high = load_data_multi()
print ('The shape of X_train_high is:', X_train_high.shape)
print ('The shape of X_val_high is:', X_val_high.shape)
print ('The shape of y_val_high is: ', y_val_high.shape)
The shape of X_train_high is: (1000, 11)
The shape of X_val_high is: (100, 11)
The shape of y_val_high is:  (100,)

异常检测

现在,让我们在这个新的数据集上运行异常检测算法。

下面的代码将使用您的代码来:

  • 估计高斯参数 ( μ i \mu_i μi σ i 2 \sigma_i^2 σi2)
  • 对训练数据 X_train_high(从中估计了高斯参数)以及交叉验证集 X_val_high 计算概率。
  • 最后,它将使用 select_threshold 来找到最佳阈值 ε \varepsilon ε
# 对更大的数据集应用相同的步骤

# 估计高斯分布的参数
mu_high, var_high = estimate_gaussian(X_train_high)

# 计算训练集数据的概率
p_high = multivariate_gaussian(X_train_high, mu_high, var_high)

# 计算交叉验证集数据的概率
p_val_high = multivariate_gaussian(X_val_high, mu_high, var_high)

# 找到最佳阈值
epsilon_high, F1_high = select_threshold(y_val_high, p_val_high)

print('使用交叉验证找到的最佳阈值: %e'% epsilon_high)
print('交叉验证集上的最佳F1值:  %f'% F1_high)
print('# 发现的异常数据数: %d'% sum(p_high < epsilon_high))

使用交叉验证找到的最佳阈值: 1.377229e-18
交叉验证集上的最佳F1值:  0.615385
# 发现的异常数据数: 117

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

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

相关文章

管理类联考——英语二——知识篇——写作题目说明——B节

MBA&#xff0c;MPA&#xff0c;MPAcc管理类联考英语写作部分由A&#xff0c;B两节组成&#xff0c;主要考查考生的书面表达能力。共2题&#xff0c;25分。A节要求考生根据所给情景写出约100词(标点符号不计算在内)的应用文&#xff0c;包括私人和公务信函、通知、备忘录等。共…

【ESP8266 (12F)】硬件参数 以及 固件烧录

本文资料及工具地址&#xff1a;https://github.com/CQUPTLei/ESP8266 一、基本关系1.1 ESP8266 芯片 和 ESP 12F 模组1.2 乐鑫科技和安信可 二、ESP 8266开发板2.1 ESP 12F 产品规格2.2 ESP8266 开发板 三、固件与固件下载3.1 什么是固件3.2 固件和用户程序3.2 如何下载固件3.…

Linux下配置lunavim

前言 在lunavim官网中提供了安装脚本&#xff0c;一件安装即可&#xff0c;但是经常因为网络不稳定而导致安装失败。这里提供在Linux下进行git加速的几种方法&#xff0c;可以尝试下。如果问题没有解决&#xff0c;也不要担心&#xff0c;我们还提供了两种平替方法进行luanvim的…

linux实验五sed和awk

按要求写出正则表达式 显示/etc/passwd中以bash结尾的行;显示/var/log/secure文件中包含“Failed”或“FAILED”的行查找/etc/man_db.conf中含有“以m开头&#xff0c;并以n结尾的单词”模式的行&#xff1b;显示/etc/man_db.conf中&#xff0c;包含Linux绝对路径的行&#xff…

基础巩固(六)自定义View

文章目录 View绘制流程MeasureLayoutDraw 自定义View的实现的步骤步骤1&#xff1a;实现Measure、Layout、Draw流程自定义 MeasureViewGroup.LayoutParamsMeasureSpec 自定义Layout 自定义属性 绘制工具类Paint具体使用 PathCanvas View绘制流程 在绘制前&#xff0c;系统会有一…

Python恶搞代码

文章目录 前言Tkinter界面设计Threading多线程恶搞代码 尾声 前言 快来领取python无限弹窗恶搞代码吧&#xff01;每天写一些有趣的小程序&#xff0c;带你成为一个浪漫的程序员&#xff01; Tkinter界面设计 1. 创建一个简单的界面 Tkinter 是 Python 标准库中的一个 GUI&…

自然语言处理从入门到应用——动态词向量预训练:双向语言模型

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 对于给定的一段输入文本 w 1 w 2 ⋯ w n w_1w_2\cdots w_n w1​w2​⋯wn​&#xff0c;双向语言模型从前向&#xff08;从左到右&#xff09;和后向&#xff08;从右到左&#xff09;两个方向同时建立语言模型。这样做…

go 调试利器之pprof指标分析

文章目录 概要一、指标类型1.1、堆栈指标1.2、CPU指标分析1.3、http-pprof 二、go tool pprof2.1、可视化2.2、CPU火焰图 概要 Go语言原生支持对于程序运行时重要指标或特征进行分析。pprof是其中一种重要的工具&#xff0c;其不仅可以分析程序运行时的错误&#xff08;内存泄…

ChatGPT 之 LangChain的文本切割方法对比

本文来自http://blog.csdn.net/hellogv/ &#xff0c;引用必须注明出处&#xff01; ChatGPT面向对话格式的文本理解很好&#xff0c;但如果要把网络上的文章让ChatGPT直接分析则会有格式的问题。文本清洗是个大课题&#xff0c;讲起来需要很多篇幅&#xff0c;优化起来前路漫…

使用arduino IDE开发ESP8266NodeMCU连接DHT11实现温湿度检测并上传onenet官网

前言&#xff1a; 本篇博客记录一下以arduino IDE来开发一下ESP8266NodeMCU&#xff0c;实现用DHT11进行温湿度检测&#xff0c;并且上传新版的onenet官网&#xff1b;我在实现这个小项目的时候&#xff0c;发现网上资料有关onenet的资料都是旧版的&#xff0c;这就有点难受了&…

[MAUI]弧形进度条与弧形滑块的交互实现

文章目录 弧形基类定义绘制弧 弧形进度条(ProgressBar)添加动画宽度补偿文本 弧形滑块(Slider)创建控制柄拖动事件处理 项目地址 进度条&#xff08;ProgressBar&#xff09;用于展示任务的进度&#xff0c;告知用户当前状态和预期&#xff1b; 滑块&#xff08;Slider&#xf…

本地安装部署运行 ChatGLM-6B 的常见问题解答以及后续优化

报错 No module named ‘transformers_modules.THUDM/chatglm-6b’ 报错本身的意思是&#xff0c;没有在指定的路径THUDM/chatglm-6b找到推理用模型 一般常见于自己手动下载模型&#xff0c;而不是通过下边这些文件直接启动&#xff0c;自动下载的情况 你需要修改web_demo.py&…

分层测试终究是大梦一场空?

分层测试分了个寂寞&#xff1f; 分层测试这个风吹了好多年&#xff0c;不分层都不好意思说自己是专业测试。各互联网公司更是对此乐此不疲&#xff0c;测试架构、测试平台&#xff0c;搞了一套又一套&#xff0c;然而。。。 理想总是丰满&#xff0c;现实总是骨干&#xff0…

第十三章 反射操作相关函数

1. 【检测对象是否可被调用】callable()函数 语法参考 callable函数的语法格式如下&#xff1a; callable(object)参数说明&#xff1a; object&#xff1a;对象&#xff1b; 返回值&#xff1a;如果对象可调用返回 True&#xff0c;否则返回 False。 说明&#xff1a;对于…

Python 中print 和return 的区别,你了解吗?

1、print() print()函数的作用是输出数据到控制台,就是打印在你能看到的界面上。 2、return return语句[表达式]退出函数&#xff0c;选择性地向调用方返回一个表达式。不带参数值的return语句返回None。 return作为脚本单独运行时则需要print函数才能显示&#xff0c;但是…

【id:17】【1分】A. DS顺序表--类实现

题目描述 用C语言和类实现顺序表 属性包括&#xff1a;数组、实际长度、最大长度&#xff08;设定为1000&#xff09; 操作包括&#xff1a;创建、插入、删除、查找 类定义参考 输入 第1行先输入n表示有n个数据&#xff0c;即n是实际长度&#xff1b;接着输入n个数据 第2行输…

c语言项目——三子棋小游戏(带详细讲解解析)

1.三子棋是什么&#xff1f; 三子棋是一种民间传统游戏&#xff0c;又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战&#xff0c;双方依次在9宫格棋盘上摆放棋子&#xff0c;率先将自己的三个棋子走成一条线就视为胜利&#xff0c;而对方就算输了&#xff0c;但是…

【MySQL 索引、事务与存储引擎】

目录 一、索引的介绍2、索引的作用3、创建索引的原刚依据&#xff08;面试题&#xff09; 二、索引的分类和创建1、普通索引2、唯一索引3、主键索引4、组合索引5、全文索引6、查看索引7、删除索引8、分析是否使用索引 三、MySQL事务介绍1、事务的ACID特性2、隔离性 --- 不一致的…

Linux编译器gcc/g++

文章目录 Liinux编译器gcc/g1.背景知识(程序的翻译)2.动态库、静态库 Liinux编译器gcc/g 1.背景知识(程序的翻译) 以gcc编译 以g编译&#xff0c;但是此时会发现没有g这个指令&#xff0c;所有需要安装它&#xff0c;安装指令 yum install gcc gcc-c gcc和g都会形成可执行文…

TransFusion:利用 Transformer 进行鲁棒性融合来进行 3D 目标检测

Query 初始化 Input-dependent 以往 Query 位置是随机生成或学习作为网络参数的&#xff0c;而与输入数据无关&#xff0c;因此需要额外的阶段&#xff08;解码器层&#xff09;来学习模型向真实对象中心移动的过程。 论文提出了一种基于center heatmap 的 input-dependent 初…