吴恩达机器学习 第三课 week1 无监督学习算法(下)

目录

01 学习目标

02 异常检测算法

2.1 异常检测算法的概念

2.2 基于高斯模型的异常检测 

03 利用异常检测算法检测网络服务器的故障

3.1 问题描述

3.2 算法实现

3.3 问题升级

04 总结


01 学习目标

    (1)理解异常检测算法(Anomaly Detection Algorithm)的原理

    (2)利用异常检测算法检测网络服务器的故障。

02 异常检测算法

2.1 异常检测算法的概念

       异常检测算法不是指某一特定算法,而是实现异常检测功能的算法统称,旨在识别数据集中不符合常规模式的数据点,如欺诈检测、网络安全、故障预测、生产线上的残次品等。以下是常用的异常检测算法:

  1. 基于统计的方法:

    • Z-Score: 计算数据点与数据集平均值的偏离程度,使用标准差作为度量。如果一个数据点的Z-Score超过某个阈值(通常是3),则认为它是异常的。
    • IQR(四分位距): 计算数据的第一四分位数(Q1)和第三四分位数(Q3)之间的距离,任何小于Q1-1.5IQR或大于Q3+1.5IQR的值被视为异常。
  2. 基于密度的方法:

    • 局部异常因子(LOF, Local Outlier Factor): 通过比较一个数据点与其邻居的密度来识别异常。如果一个点的密度远低于其邻居,则被认为是异常的。
    • DBSCAN(Density-Based Spatial Clustering of Applications with Noise): 一种聚类算法,能够识别出低密度区域的点作为异常点。
  3. 基于距离的方法:

    • K-最近邻(KNN): 通过计算一个数据点到其K个最近邻的距离的平均值或加权平均值,如果这个值显著高于其他点,则认为该点是异常的。
  4. 基于概率模型的方法:

    • 高斯混合模型(GMM): 利用GMM拟合数据分布,异常点被定义为在模型下概率很低的点。
    • 隐马尔可夫模型(HMM): 对于序列数据,HMM可以用来学习数据的正常行为模式,异常则表现为模型预测概率显著降低的状态。
  5. 基于机器学习的方法:

    • 孤立森林(Isolation Forest): 通过构建随机的决策树来“隔离”数据点,异常点更容易被“孤立”,因此通过平均路径长度来评估数据点的异常程度。
    • 支持向量机(SVM): 在异常检测中,可以通过一类SVM(只有一类标签的数据)来构造一个边界,将大部分数据包含在内,超出这个边界的点视为异常。
  6. 深度学习方法:

    • 自编码器(Autoencoders): 通过训练一个自编码器来重构输入数据,异常数据往往导致较大的重构误差。
    • 生成对抗网络(GANs): 可以学习数据的正常分布,异常点通过与生成的正常数据对比来识别。

2.2 基于高斯模型的异常检测 

       高斯模型是一种连续型概率模型,用于表示服从高斯分布(正态分布)的数据。

       n维高斯分布:

f(\textbf{x}|\theta )=\frac{1}{(2\pi)^{n/2}|\sum |^{1/2}}exp[-\frac{1}{2}(\textbf{x}-\mu )^{T}|\sum |^{-1}(\textbf{x}-\mu )]

上式中,\theta=(\mu ,\sum )为待估计参数,\mu是均值,\sigma ^2是方差,由最大似然估计得到。

        n=1时,上式变为一元高斯分布:

f(x|\theta )=\frac{1}{(2\pi)^{1/2}\sigma }exp[-\frac{1}{2}(x-\mu )^2\sigma ^{-2}]=\frac{1}{\sqrt{2\pi}\sigma }exp[-\frac{(x-\mu )^2}{2\sigma ^{2}}]

上式中,参数\mu\sigma ^2按下式估计:

\mu_j=\frac{1}{m}\sum_{i=1}^{m}x_j^{(i)}

\sigma^2_j=\frac{1}{m}\sum_{i=1}^{m}(x_j^{(i)}-\mu_j)^2

上式中,j为特征序数,i为特征的数据序数,m为数据总数。

        基于高斯模型的异常检测的原理即选定一个适当小的概率值p_\varepsilon作为界限,出现概率小于p_\varepsilon的数据均为异常数据。如下图所示(以1维为例):

03 利用异常检测算法检测网络服务器的故障

3.1 问题描述

       假设你现在是贝塔科技公司的高级主管,负责公司的服务器运维。今天你抽检了服务器的307份数据,打算采用“传输的数据量 (mb/s,每秒兆字节)”和“每台服务器的响应延迟(ms,毫秒)”两项指标检测网络服务器是否存在故障。

       Let's begining!

3.2 算法实现

     (1)导包

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

    (2) 导入数据

      数据分为训练集和交叉验证集两部分:训练集共307组数据(抽检的数据),每组数据有2个数值,代表2个特征:“传输的数据量”、“服务器的响应延迟”;交叉验证集收集了307组数据(以前保存的数据),每组数据有3个数值,分别为2个特征和1个值,值为0或1:0为正常、1为异常。训练集数据无标签,用于估计参数\mu\sigma ^2;交叉验证集数据被标记0/1,用于确定概率界限p_{\varepsilon}.。

# 导入数据
X_train, X_val, y_val = load_data()

       X_train为训练数据集的特征列(307*2),X_val为交叉验证集的特征列(307*2),y_val 为交叉验证集的标签列(307*1)。

    (3)参数估计

        先定义高斯估计函数:

def estimate_gaussian(X): m, n = X.shapemu = np.ones(n)var = np.ones(n)for i in range(n):mu = np.sum(X, axis=0) / m    var = np.sum((X - mu) **2, axis=0) / mreturn mu, var

       然后估计参数 :

# 估计每个特征的参数
mu, var = estimate_gaussian(X_train)              print("Mean of each feature:", mu)
print("Variance of each feature:", var)

      运行以上代码,结果如下:

Mean of each feature: [14.11222578 14.99771051]
Variance of each feature: [1.83263141 1.70974533]

      现在有了参数\mu\sigma ^2,我们可以绘出概率密度分布:

# visualize_fit为自定义绘图函数
#visualize_fit(X_train, mu, var)
visualize_fit(X_val, mu, var)

       运行以上代码,结果如下(左为训练集、右为交叉验证集):

  

       (4)定义概率模型

         得到 估计参数\mu\sigma ^2后,可以利用高斯分布定义概率模型:

def multivariate_gaussian(X, mu, var):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

       (上面,定义了一个n维高斯分布的概率模型) 

       (5)确定概率界限

        确定概率界限的原则是,p_{\varepsilon}在合理的取值下,当p_a<p_{\varepsilon}时,在交叉验证集中异常点a能被准确识别到。如何保证高精度地识别异常呢?可以采用F1评分标准,取一系列p_{\varepsilon}进行计算,谁的F1分数最高就选谁,步骤如下:

        首先,给定p_{\varepsilon}进行预测,将预测值与实际值进行对比得到4类情况,如下表:

        然后,计算两个指标:precision(精度,查准率)和recall(召回率,查全率):

prec=\frac{tp}{tp+fp}

rec=\frac{tp}{tp+fn}

precision的含义是异常预测正确的概率有多大,recall的含义是成功找出异常的概率有多大。这两个指标存在这样的问题:当阈值p_{\varepsilon}设置为大值时prec增大、rec减小,当阈值p_{\varepsilon}设置为小值时prec减小、rec增大。

        接下来,计算一个更均衡的指标F1:

F_1=\frac{2\cdot prec\cdot rec}{prec + rec}

F1将prec和rec进行了平衡,并且F1数值受二者中较小值控制。

        现在,可以定义概率界限计算函数:

def select_threshold(y_val, p_val): 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 = p_val < epsilontp = np.sum((predictions == 1) & (y_val == 1))fp = np.sum((predictions == 1) & (y_val == 0))fn = np.sum((predictions == 0) & (y_val == 1))if (tp + fp)  == 0 or (tp + fn) == 0:prec = 0rec = 0F1 = 0else:prec = tp / (tp + fp)rec = tp / (tp + fn)F1 = 2 * prec * rec / (prec + rec)if 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)

       运行以上代码,结果如下:

Best epsilon found using cross-validation: 8.990853e-05
Best F1 on Cross Validation Set: 0.875000

      (6)检测异常,可视化

# 在训练集上找出异常值
outliers = p < epsilon# 二维图中绘出307组数据
visualize_fit(X_train, mu, var)# 用红色圆圈标记异常值
plt.plot(X_train[outliers, 0], X_train[outliers, 1], 'ro',markersize= 10,markerfacecolor='none', markeredgewidth=2)

       运行以上代码,结果如下:

       经过一番操作,发现这抽检的307组合数据中有6组异常。

3.3 问题升级

       当你检测出异常后,贝塔科技公司的同事们不停欢呼、夸赞你技术高超,希望你再秀一秀高级的。身为主管的你决定再抽检一批数据,以11个特征为依据进行异常检测。

       开始吧!

     (1)导入数据

# 导入数据
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,)

      (2)开始检测

# 参数估计
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)# 计算异常数量
anomalies = sum(p_high < epsilon_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'% anomalies)

        运行以上代码,结果为:

Best epsilon found using cross-validation: 1.377229e-18
Best F1 on Cross Validation Set:  0.615385
# Anomalies found: 117

04 总结

     (1)异常检测算法的交叉验证集数据也是有标记的,但不同于监督学习算法的二分类:异常检测的数据中异常类型较多、但数量较少,分布极为不均。

     (2)异常检测的实现算法与维度(特征数)无关,均为4个步骤:参数估计>概率计算>确定阈值>检测异常。

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

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

相关文章

Android Settings值和SystemProperties值的使用

android源码开发中 常常要用到一些全局标志或者说变量 这时候我们可以给android系统添加自己想要的属性 Settings的使用方法 导入import android.provider.Settings; Settings.Global 写入值方法&#xff1a; Settings.Global.putString(getContentResolver(),"sys.s…

服务器上并行提交任务

实用场景 1你的任务是相互独立的 2你本来使用的是for循环&#xff0c;你想提高时间想要把全部这些独立的文件&#xff0c;一起提交一起跑 3你的任务数量很多并且任务同时用一个脚本&#xff0c;只是不同任务的参数不易呀&#xff0c;本质上你一个个提交也可以&#xff0c;但是…

lvgl v8.3 windows仿真

1&#xff0c;下载安装codeblocks20.03 https://zenlayer.dl.sourceforge.net/project/codeblocks/Binaries/20.03/Windows/codeblocks-20.03mingw-setup.exe?viasf1 2&#xff0c;下载代码 git clone --recurse-submodules https://github.com/lvgl/lv_port_win_codeblock…

双指针算法——滑动窗口

前言&#xff1a; 滑动窗口本质上也是利用双指针来解决特定情况下的问题。滑动窗口算法思想是通过俩个指针&#xff0c;定义在左边和右边&#xff0c;俩指针同向运动&#xff0c;保持着一个像“窗口”一样的双指针来不停的压缩或者扩展来移动“窗口”&#xff0c;从而找到特定…

DigitalOcean Droplet 云主机新增内置第五代 Xeon CPU 机型

DigitalOcean 近期宣布&#xff0c;在其高级 CPU 服务器&#xff08;Premium CPU-Optimized Droplet&#xff09;队列中引入英特尔第五代Xeon可扩展处理器&#xff08;代号为 Emerald Rapids&#xff09;。作为英特尔产品线中的最新一代用于数据中心工作负载的处理器&#xff0…

深入探索PostgreSQL的复制功能:原理、配置与实践

PostgreSQL是一个高度可扩展的开源对象关系数据库系统&#xff0c;它提供了强大的数据复制功能&#xff0c;以确保数据的高可用性和容错性。PostgreSQL的复制功能允许多个数据库服务器之间同步数据&#xff0c;从而支持读写分离、负载均衡和备份等多种应用场景。本文将详细介绍…

Java接口、抽象类、继承运用练习

按以下要求编写一个完整的 Java 程序&#xff1a; &#xff08;1&#xff09;编写抽象类 GeometricObject 类&#xff1b; • 该类包括 String型的变量 color 和 boolean 型的 filled 变量&#xff1b; •该类有一个默认的构造方法&#xff1b; •两个抽象方法&#xff0c;计算…

【C/C++】静态函数调用类中成员函数方法 -- 最快捷之一

背景 注册回调函数中&#xff0c;回调函数是一个静态函数。需要调用类对象中的一个成员函数进行后续通知逻辑。 方案 定义全局指针&#xff0c;用于指向类对象this指针 static void *s_this_obj;类构造函数中&#xff0c;将全局指针指向所需类的this指针 s_this_obj this…

golang string、byte[]以及rune的基本概念,用法以及区别

在 Go 语言中&#xff0c;string、byte[] 和 rune 是处理文本和字符的三种不同数据类型。它们有各自的用途和特点&#xff0c;下面将详细介绍它们的基本概念、用法以及区别。 1. string 基本概念 字符串类型&#xff1a;string 是 Go 语言中的一种基本类型&#xff0c;用于表…

LangCell:用于细胞注释的语言-细胞预训练模型

细胞身份包括细胞的各种语义&#xff0c;包括细胞类型、pathway信息、疾病信息等。从转录组数据中了解细胞身份&#xff0c;例如注释细胞类型&#xff0c;是一项基础任务。由于语义是由人类赋予的&#xff0c;如果没有cell-label pair提供监督信号&#xff0c;AI模型很难有效地…

小项目——MySQL集训(学生成绩录入)

ddl语句 -- 创建学生信息表 CREATE TABLE students (student_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 学生ID,name VARCHAR(50) NOT NULL COMMENT 学生姓名,gender ENUM(男, 女) NOT NULL COMMENT 性别,class VARCHAR(50) NOT NULL COMMENT 班级,registration_date DATE CO…

【杂记-浅谈EBGP外部边界网关协议、IBGP内部边界网关协议】

一、EBGP概述 EBGP&#xff0c;External Border Gateway Protocol&#xff0c;即外部边界网关协议&#xff0c;EBGP主要用于在不同自治系统&#xff08;AS&#xff09;之间交换路由信息&#xff0c;每个AS都有一个独特的AS号码&#xff0c;用于区分不同的自治系统。EBGP通过AS…

Redis实战—基于setnx的分布式锁与Redisson

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P56 - P63 目录 分布式锁介绍 基于SETNX的分布式锁 SETNX锁代码实现 修改业务代码 SETNX锁误删问题 SETNX锁原子性问题 Lua脚本 编写脚本 代码优化 总结 Redisson 前言…

C++泛型编程之模板的使用

文章目录 1.模板的概念1.函数模板2.类模板3.模板特化4.模板元编程 2.模板的使用1.函数模板的使用2.类模板的使用3.模板特化4.模板参数推导5.普通函数和函数模板的调用规则1. 非模板函数优先2. 最佳匹配原则3. 显式模板参数指定4. 函数模板特化5. 重载决议示例 7.注意事项8.类模…

v-for中为什么要使用key

在Vue中&#xff0c;v-for指令用于循环遍历数组或对象&#xff0c;并为每个元素或属性生成相应的DOM元素或组件实例。当使用v-for循环渲染时&#xff0c;Vue会尽量复用已有的元素&#xff0c;而不是重新创建。为了实现这个复用机制&#xff0c;Vue会根据每个元素的key来跟踪它们…

基于STM32的温湿度检测TFT屏幕proteus恒温控制仿真系统

一、引言 本文介绍了一个基于STM32的恒温控制箱检测系统&#xff0c;该系统通过DHT11温湿度传感器采集环境中的温湿度数据&#xff0c;并利用TFT LCD屏幕进行实时显示。通过按键切换页面显示&#xff0c;通过按键切换实现恒温控制箱的恒温控制。为了验证系统的可靠性和稳定性&…

MongoDB的核心点是什么,选择是否使用!

MongoDB概述 定义: MongoDB是一个文档数据库&#xff0c;设计目的在于简化应用程序的开发和扩展。起源: 由DoubleClick创始人Dwight Merriman和Kevin O’Connor于2007年启动&#xff0c;以应对大规模流量需求。 MongoDB发展历程 开发背景: 由于关系型数据库无法满足DoubleCl…

在 TS 中使用 Manifold 建模

一 Manifold 是什么 1.1 简介 Manifold 是一个几何处理库&#xff0c;专注于高效、可靠的布尔运算和几何操作。它主要用于3D建模和计算几何领域&#xff0c;提供了高性能的几何算法&#xff0c;适用于需要精确几何计算的应用场景。 1.2 主要特点 高效的布尔运算&#xff1a…

Lombok的hashCode方法

Lombok对于重写hashCode的算法真的是很经典&#xff0c;但是目前而言有一个令人难以注意到的细节。在继承关系中&#xff0c;父类的hashCode针对父类的所有属性进行运算&#xff0c;而子类的hashCode却只是针对子类才有的属性进行运算&#xff0c;立此贴提醒自己。 目前重写ha…

png格式快速压缩该怎么做?在电脑压缩png图片的方法

png格式的图片如何快速压缩变小呢&#xff1f;现在网络的不断发展&#xff0c;图片是日常用来分享展示内容的一种常用手段&#xff0c;其中使用最多的一种图片格式就是png&#xff0c;png格式具有无损压缩支持透明底的特性&#xff0c;在很多的场景下都会使用。 现在图片的清晰…