吴恩达机器学习-异常检测(Anomaly Detection)

在本练习中,您将实现异常检测算法,并将其应用于检测网络上出现故障的服务器。

文章目录

  • 1-包
  • 2-异常检测
    • 2.1问题陈述
    • 2.2数据集
    • 2.3高斯分布
      • 2.2.1高斯实现的估计参数:
      • 2.2.2选择阈值𝜖
    • 2.4高维数据集

1-包

首先,让我们运行下面的单元格来导入此分配过程中需要的所有包。
numpy是在Python中处理矩阵的基本包。
matplotlib是一个著名的Python绘图库。
utils.py包含此赋值的辅助函数。您不需要修改此文件中的代码。

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

2-异常检测

2.1问题陈述

在本练习中,您将实现一种异常检测算法来检测服务器计算机中的异常行为。
数据集包含两个特征-

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

当您的服务器运行时,您收集了𝑚=307他们的行为示例,因此有一个未标记的数据集{𝑥(1)…𝑥(𝑚)}

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

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

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

2.2数据集

您将从加载此任务的数据集开始。
下面显示的load_data()函数将数据加载到变量X_train、X_val和y_val中。您将使用X_train来拟合高斯分布。您将用X_val和y_val作为交叉验证集来选择阈值并确定异常与正常示例

# Load the dataset
X_train, X_val, y_val = load_data()

查看变量
让我们更熟悉您的数据集。
一个好的开始是打印出每个变量,看看它包含什么。
下面的代码打印每个变量的前五个元素

# Display the first five elements of X_train
print("The first 5 elements of X_train are:\n", X_train[:5])  
The first 5 elements of X_train are:[[13.04681517 14.74115241][13.40852019 13.7632696 ][14.19591481 15.85318113][14.91470077 16.17425987][13.57669961 14.04284944]]
# Display the first five elements of X_val
print("The first 5 elements of X_val are\n", X_val[:5])  
The first 5 elements of X_val are[[15.79025979 14.9210243 ][13.63961877 15.32995521][14.86589943 16.47386514][13.58467605 13.98930611][13.46404167 15.63533011]]
# Display the first five elements of y_val
print("The first 5 elements of y_val are\n", y_val[:5])  
The first 5 elements of y_val are[0 0 0 0 0]

👆这个输出代表的是前五个数据是没有异常

检查变量的维度
熟悉数据的另一种有用方法是查看其维度。
下面的代码打印X_train、X_val和y_val的形状。

print ('The shape of X_train is:', X_train.shape)
print ('The shape of X_val is:', X_val.shape)
print ('The shape of y_val is: ', y_val.shape)
The shape of X_train is: (307, 2)
The shape of X_val is: (307, 2)
The shape of y_val is:  (307,)

可视化数据
在开始执行任何任务之前,通过可视化数据来理解数据通常是很有用的。

  • 对于这个数据集,您可以使用散点图来可视化数据(X_train),因为它只有两个属性要绘制(吞吐量和延迟)
  • 你的情节应该与下面的相似

在这里插入图片描述

# Create a scatter plot of the data. To change the markers to blue "x",
# we used the 'marker' and 'c' parameters
plt.scatter(X_train[:, 0], X_train[:, 1], marker='x', c='b') # Set the title
plt.title("The first dataset")
# Set the y-axis label
plt.ylabel('Throughput (mb/s)')
# Set the x-axis label
plt.xlabel('Latency (ms)')
# Set axis range
plt.axis([0, 30, 0, 30])
plt.show()

在这里插入图片描述

2.3高斯分布

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

  • 提供一套训练集{𝑥1…𝑥(𝑚)}要估计每个特征𝑥𝑖的高斯分布
  • 回想一下,高斯分布
    在这里插入图片描述
    𝜇是均值和𝜎2控制方差。
  • 这段话是在描述一个参数估计的问题,其中有 𝑛 个特征(或者说维度),每个特征有一组数据
    {𝑥(1)𝑖,…,𝑥(𝑚)𝑖},其中 𝑚 是样本数量。问题的目标是为每个特征找到合适的参数 𝜇𝑖 和
    𝜎2𝑖,这些参数可以用来描述这些数据的分布情况。

具体来说,𝜇𝑖 是数据在第 𝑖 维的均值(平均值),而 𝜎2𝑖 则是数据在第 𝑖
维的方差(或标准差的平方)。通过估计这些参数,我们可以更好地了解数据在每个维度上的分布特征,从而进行进一步的分析或建模。

2.2.1高斯实现的估计参数:

您的任务是完成下面estimate_gaussian中的代码。

练习1
请完成下面的estimate_gaussian函数,以计算μ(X中每个特征的平均值)和var(X中各个特征的方差)。
您可以估计参数(𝜇𝑖, 𝜎𝑖^2)。要估计平均值,您将使用:在这里插入图片描述
如果遇到问题,可以查看下面单元格后面的提示,以帮助您实现。

# UNQ_C1
# GRADED FUNCTION: estimate_gaussiandef 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.mean(X, axis=1)var = np.var(X, axis=1)### START CODE HERE ### mu=1/m *np.sum(X,axis=0)var=1/m *np.sum((X-mu)**2,axis=0)### END CODE HERE ### return mu, var

您可以通过运行以下测试代码来检查您的实现是否正确:

# Estimate mean and variance of each feature
mu, var = estimate_gaussian(X_train)              print("Mean of each feature:", mu)
print("Variance of each feature:", var)# UNIT TEST
from public_tests import *
estimate_gaussian_test(estimate_gaussian)
Mean of each feature: [14.11222578 14.99771051]
Variance of each feature: [1.83263141 1.70974533]
All tests passed!
Expected Output:Mean of each feature:	[14.11222578 14.99771051]
Variance of each feature:	[1.83263141 1.70974533]

现在您已经完成了estimate_gaussian中的代码,我们将可视化拟合的高斯分布的轮廓。
你应该得到一个类似下图的图。
在这里插入图片描述
从你的图表中,你可以看到大多数例子都在概率最高的地区,而异常例子则在概率较低的地区。

# Returns the density of the multivariate normal
# at each data point (row) of X_train
p = multivariate_gaussian(X_train, mu, var)#Plotting code 
visualize_fit(X_train, mu, var)

在这里插入图片描述

这段代码涉及多元高斯分布的概率密度函数以及可视化其拟合结果。

  1. multivariate_gaussian(X_train, mu, var): 这个函数计算多元高斯分布在训练数据集 X_train 中每个数据点处的概率密度值。参数 mu 是多元高斯分布的均值向量,var 是协方差矩阵。

  2. visualize_fit(X_train, mu, var): 这个函数用于可视化多元高斯分布拟合的结果。它可能会在训练数据集 X_train
    的散点图上叠加绘制等高线或者三维曲面,以展示多元高斯分布在数据空间中的拟合情况。这样可以直观地观察模型对数据的拟合程度以及数据的分布情况。

2.2.2选择阈值𝜖

既然你已经估计了高斯参数,你就可以研究在给定这种分布的情况下,哪些例子的概率非常高,而哪些例子的可能性非常低。

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

在本节中,您将完成select_threshold中的代码使用𝐹1在交叉验证集上得分,以选择阈值𝜀

𝑚 是样本数量

  • 为此,我们将使用交叉验证集{(𝑥cv^(1),𝑦 cv^(1)),......,(𝑥 cv^(𝑚cv),𝑦cv^(𝑚cv))},其中标签𝑦=1.对应于异常示例,并且𝑦=0,对应于正常示例。
  • 对于每个交叉验证示例,我们将计算𝑝(𝑥cv^(𝑖)).所有这些概率的矢量𝑝(𝑥cv^(1)),…,𝑝(𝑥(𝑚cv))被传递到向量p_val中的select_threshold。
  • 相应的标签𝑦cv^(1),…,𝑦cv^(𝑚cv)被传递给向量y_ val中的相同函数。

对上述说明进行解释:

假设我们有一个交叉验证集,其中包含三个样本,每个样本有两个特征。这个交叉验证集可以表示为一组元组,每个元组包含一个特征向量和一个标签。假设这些样本如下:

样本1:特征向量为 [5.1, 3.5],标签为 0(表示正常样本) 样本2:特征向量为 [4.9, 3.0],标签为 1(表示异常样本)
样本3:特征向量为 [6.0, 2.7],标签为 0(表示正常样本) 则这个交叉验证集可以表示为如下形式的元组:

[([5.1, 3.5], 0), ([4.9, 3.0], 1), ([6.0, 2.7], 0)]

对于交叉验证集中的每个样本,计算其在训练好的多元高斯模型下的概率密度值,即 𝑝(𝑥(𝑖)cv)。

将所有样本的概率密度值组成向量,记为 p_val。

同时,将交叉验证集中的所有样本的真实标签组成向量,记为 y_val。

将概率密度向量 p_val 和真实标签向量 y_val 传递给select_threshold,该函数用于根据概率密度和真实标签选择一个合适的阈值,以区分正常样本和异常样本。这个阈值可以用于根据模型输出的概率密度值判断一个样本是否为异常
在这里插入图片描述

练习2
请完成下面的select_threshold函数,根据验证集(p_val)和基本事实(y_val)的结果,找到用于选择异常值的最佳阈值。

  • 在提供的代码select_threshold中,已经有一个循环将尝试的许多不同值𝜀,并基于𝐹1分数选择最好的𝜀

  • 您需要实现代码,通过选择epsilon作为阈值来计算F1分数,并将值放在F1中。

    • 回想一下,如果一个例子𝑥概率很低𝑝(𝑥)<𝜀,则将其归类为异常。

    • 然后,您可以通过以下方式计算精度和召回率:在这里插入图片描述

    • 𝑡𝑝是真阳性的数量:地面实况标签说这是一个异常,我们的算法正确地将其归类为异常。

    • 𝑓𝑝是误报的数量:基本事实标签说这不是异常,但我们的算法错误地将其归类为异常。

    • 𝑓𝑛是假阴性的数量:地面实况标签说这是异常,但我们的算法错误地将其归类为非异常。

  • 这个𝐹1.使用精度(𝑝𝑟𝑒𝑐)和召回(𝑟𝑒𝑐)如下所示:

在这里插入图片描述

**实施说明:**为了计算𝑡𝑝, 𝑓𝑝和𝑓𝑛,您可能能够使用矢量化实现,而不是在所有示例上循环。
如果遇到问题,可以查看下面单元格后面的提示,以帮助您实现。

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):# Predictions based on epsilonpreds = (p_val < epsilon).astype(int)# True positivesTP = np.sum((preds == 1) & (y_val == 1))# False positivesFP = np.sum((preds == 1) & (y_val == 0))# False negativesFN = np.sum((preds == 0) & (y_val == 1))# Calculate precision and recallprec = TP / (TP + FP) if (TP + FP) != 0 else 0rec = TP / (TP + FN) if (TP + FN) != 0 else 0# Calculate F1 scoreF1 = (2 * prec * rec) / (prec + rec) if (prec + rec) != 0 else 0if F1 > best_F1:best_F1 = F1best_epsilon = epsilonreturn 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)# UNIT TEST
select_threshold_test(select_threshold)
Best epsilon found using cross-validation: 8.990853e-05
Best F1 on Cross Validation Set: 0.875000
All tests passed!
Expected Output:Best epsilon found using cross-validation:	8.99e-05
Best F1 on Cross Validation Set:	0.875

现在,我们将运行您的异常检测代码,并在图中圈出异常(下图3)。
在这里插入图片描述

# Find the outliers in the training set 
outliers = p < epsilon# Visualize the fit
visualize_fit(X_train, mu, var)# Draw a red circle around those outliers
plt.plot(X_train[outliers, 0], X_train[outliers, 1], 'ro',markersize= 10,markerfacecolor='none', markeredgewidth=2)

在这里插入图片描述

2.4高维数据集

现在,我们将在更现实、更困难的数据集上运行您实现的异常检测算法。
在这个数据集中,每个示例都由11个特性描述,捕获了计算服务器的更多属性。
让我们从加载数据集开始。

  • 下面显示的load_data()函数将数据加载到变量X_train_high、X_val_high和y_val_high中
  • _high是指将这些变量与前一部分中使用的变量区分开来。
  • 我们将使用X_train_high来拟合高斯分布。
  • 我们将用X_val_high和y_val_high作为交叉验证集来选择阈值并确定异常与正态示例
# load the dataset
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,)

异常检测
现在,让我们在这个新的数据集上运行异常检测算法。
下面的代码将使用您的代码

  • 估计高斯参数(𝜇𝑖和𝜎i2)
  • 评估用于估计高斯参数的训练数据X_train_high以及交叉验证集X_val_high的概率。
  • 最后,它将使用select_threshold来找到最佳阈值𝜀 .
# Apply the same steps to the larger dataset# Estimate the Gaussian parameters
mu_high, var_high = estimate_gaussian(X_train_high)# Evaluate the probabilites for the training set
p_high = multivariate_gaussian(X_train_high, mu_high, var_high)# Evaluate the probabilites for the cross validation set
p_val_high = multivariate_gaussian(X_val_high, mu_high, var_high)# Find the best threshold
epsilon_high, F1_high = select_threshold(y_val_high, p_val_high)print('Best epsilon found using cross-validation: %e'% epsilon_high)
print('Best F1 on Cross Validation Set:  %f'% F1_high)
print('# Anomalies found: %d'% sum(p_high < epsilon_high))
Best epsilon found using cross-validation: 1.377229e-18
Best F1 on Cross Validation Set:  0.615385
# Anomalies found: 117
Expected Output:Best epsilon found using cross-validation:	1.38e-18
Best F1 on Cross Validation Set:	0.615385
# anomalies found:	117

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

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

相关文章

基于FPGA的以太网相关文章导航

首先需要了解以太网的一些接口协议标准&#xff0c;常见的MII、GMII、RGMII时序&#xff0c;便于后续开发。 【必读】从MII到RGMII&#xff0c;一文了解以太网PHY芯片不同传输接口信号时序&#xff01; 介绍一款比较老的以太网PHY芯片88E1518&#xff0c;具有RGMII接口&#xf…

代码随想录阅读笔记-二叉树【总结】

二叉树的理论基础 代码随想录 (programmercarl.com)&#xff1a;二叉树的种类、存储方式、遍历方式、定义方式 二叉树的遍历方式 深度优先遍历 代码随想录阅读笔记-二叉树【递归遍历】-CSDN博客&#xff1a;递归三部曲初次亮相代码随想录阅读笔记-二叉树【迭代遍历】-CSDN博…

thinkphp6入门(22)-- 如何下载文件

假设在public/uploads文件夹下有一个文件test.xlsx 在前端页面添加下载链接&#xff0c;用户点击该链接即可下载对应的文件。 <a href"xxxxxxx/downloadFile">下载文件</a> 2. 在后端控制器方法中&#xff0c;我们需要获取要下载的文件路径&#xff0…

java+saas模式医院云HIS系统源码Java+Spring+MySQL + MyCat融合BS版电子病历系统,支持电子病历四级

javasaas模式医院云HIS系统源码JavaSpringMySQL MyCat融合BS版电子病历系统&#xff0c;支持电子病历四级 云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务&#xff0c;提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员…

C语言—用EaxyX绘制实时钟表

代码效果如图 #undef UNICODE #undef _UNICODE #include<graphics.h> #include<conio.h> #include<math.h>#define width 640 #define high 480 #define PI 3.14159int main() {initgraph(width, high);int center_x, center_y;center_x width / 2;center_y…

基于 SMM 汽车交易系统(源码+配套文档)

摘要 电子商务的兴起不仅仅是带来了更多的就业行业。同样也给我们的生活带来了丰富多彩的变化。多姿多彩的世界带来了美好的生活&#xff0c;行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面&#xff0c;信息技术至始至终都是成就行业发展的重要秘密。不论…

nginx学习记录-负载均衡策略

1. 负载均衡基本策略配置 1.1 weight&#xff08;权重&#xff09;配置 weight表示当前服务器承载的业务比例。假设现在有两台服务器A和B组成集群&#xff0c;但是A和B的配置不一样&#xff0c;A的性能更好些&#xff0c;那么此时我们希望服务器A能承载更多的业务&#xff0c…

【Ubuntu】update-alternatives 命令详解

1、查看所有候选项 ​​​​​​​sudo update-alternatives --list java 2、​​​​​​​更换候选项 sudo update-alternatives --config java 3、自动选择优先级最高的作为默认项 sudo update-alternatives --auto java 4、删除候选项 sudo update-alternatives --rem…

halcon缺陷检测-印刷品检测(差异化模型),键盘字符缺陷检测

前言 在实际项目中&#xff0c;印刷品缺陷检测是缺陷检测中的难点项目。通常印刷品检测往往具备缺陷小&#xff0c;缺陷所在位置不固定&#xff0c;出现少印或者多印的情况。并且由于产线原因&#xff0c;大量的印刷品在视野中的大小并不是完全一致的&#xff0c;可能出现细微…

java-数组转换为List集合

方法一&#xff1a;使用 Arrays.asList() 方法 Arrays.asList() 方法可以将数组转换为一个固定大小的List。 import java.util.Arrays; import java.util.List; import java.util.ArrayList; public class ArrayToListExample { public static void main(String[] args…

易绘创云打印怎么样?易绘创云打印好用吗?

随着云技术的发展&#xff0c;云打印等概念也逐渐火热了起来。作为当下云打印服务行业中的佼佼者&#xff0c;易绘创云打印服务页一直被众多用户讨论着。那么易绘创云打印怎么样&#xff1f;易绘创云打印好用吗&#xff1f;今天小易就带大家来介绍一下。 易绘创云打印怎么样&am…

C语言面试题之合法二叉搜索树

合法二叉搜索树 实例要求 实现一个函数&#xff0c;检查一棵二叉树是否为二叉搜索树&#xff1b; 示例 1: 输入:2/ \1 3 输出: true 示例 2: 输入:5/ \1 4/ \3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 &#xff0c;但是其右子节点值为 4 …

Vuex(vue 项目中实现 频繁、大范围数据共享的技术方案)

参考文档(点击查看) 好处 1.数据的存取一步到位&#xff0c;不需层层传递 2.数据的流动非常清晰 3.存储在Vuex中的数据都是响应式的&#xff08;数据更新后&#xff0c;使用数据的组件都会自动更新&#xff09; Vuex基础配置 npm i vuex3.6.2state中用来存储数据&#xff0c…

三:synchronized 关键字

目录 1、共享带来的问题2、synchronized 用法3、类加载器对 Class 锁的影响4、synchronized 实现原理4.1、同步方法、同步代码块4.2、对象内存布局4.3、Monitor 对象定义 5、synchronized 与原子性6、synchronized 与可见性7、synchronized 与有序性8、synchronized 锁升级8.1、…

外包干了15天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

第十四届蓝桥杯大赛软件赛省赛C/C++大学 B 组

第十四届蓝桥杯大赛软件赛省赛C/C大学 B 组 文章目录 第十四届蓝桥杯大赛软件赛省赛C/C大学 B 组1、日期统计2、01串的熵3、冶炼金属4、飞机降落5、接龙数列6、岛屿个数7、子串简写8、整数删除9、景区导游10、砍树 1、日期统计 分析&#xff1a; 本题的意思就是2023年一整年&a…

c++作业day4

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include <QTime> #include <QTextToSpeech> #include <QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass…

技术分享 | Frida 实现 Hook 功能的强大能力

Frida 通过 C 语言将 QuickJS 注入到目标进程中&#xff0c;获取完整的内存操作权限&#xff0c;达到在程序运行时实时地插入额外代码和数据的目的。官方将调用代码封装为 python 库&#xff0c;当然你也可以直接通过其他的语言调用 Frida 中的 C 语言代码进行操作。 Frida安装…

【现代C++】线程支持库

现代C&#xff08;C11及其之后的版本&#xff09;引入了标准的线程支持库&#xff0c;使得多线程编程变得更加简单和可移植。这个库提供了线程管理、互斥量、条件变量和其他同步原语。 1. std::thread - 基本线程 std::thread允许创建执行特定任务的线程。 #include <ios…

【刷题】备战蓝桥杯 — dfs 算法

送给大家一句话&#xff1a; 风度真美&#xff01; 即使流泪&#xff0c;也要鼓掌&#xff0c; 即使失望&#xff0c;也要满怀希望。 ——刘宝增 dfs 算法 1 前言2 洛谷 P1030 [NOIP2001 普及组] 求先序排列题目描述算法思路 3 洛谷 P1294 高手去散步题目描述算法思路 4 蓝桥…