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

news2024/11/17 10:00:13

目录

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.shape
    mu = 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) / m
        
    return 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 - mu
    p = (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 = 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))
        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 = 0
            rec = 0
            F1 = 0
        else:
            prec = tp / (tp + fp)
            rec = tp / (tp + fn)
            F1 = 2 * prec * rec / (prec + rec)
        
        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

      (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.coloradmin.cn/o/1857458.html

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

相关文章

线程也不是越多越好,多少是好?

前面我们评估了不同大小基因组构建索引所需的计算资源和时间资源和不同大小数据集比对所需的计算资源和时间资源。 下面我们进一步看下不同线程数的影响。 测试电脑配置 这是一个10核、20线程的处理器&#xff0c;主频2.8 G HZ&#xff0c;可超频到5.2 GhZ。 在Windows系统…

windows系统上nginx搭建文件共享

1、下载windows版nginx 下载地址 2、配置nginx 编辑nginx.conf配置文件 在http模块下添加这个参数 underscores_in_headers on;#修改location内容&#xff0c;共享哪个文件夹&#xff0c;就写哪个文件夹&#xff0c;最后一定要跟上/&#xff0c;否则无法访问 location / {…

Java内存模型中的“可见性”、“原子性”、“有序性”,它们如何影响多线程程序的行为?

在Java内存模型&#xff08;Java Memory Model, JMM&#xff09;中&#xff0c;“可见性”、“原子性”和“有序性”是确保多线程程序正确执行的三个核心概念。它们直接影响到多线程环境下数据的一致性和程序的行为。 可见性&#xff08;Visibility&#xff09; 概念&#xf…

Android 大话binder通信 (下)

戳蓝字“牛晓伟”关注我哦&#xff01; 用心坚持输出易读、有趣、有深度、高质量、体系化的技术文章 前情提要 Android 大话binder通信 (上)主要介绍了矮挫丑进程一直暗恋白富美进程&#xff0c;遂发送情书给她&#xff0c;以表达对她的爱慕之情&#xff0c;而情书顺利的到达…

NFTScan | 06.17~06.23 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.06.17~ 2024.06.23 NFT Hot News 01/ Slerf 将向其 NFT 持有者空投&#xff0c;快照将在几小时内拍摄 6 月 17 日&#xff0c;Slerf 宣布将为其 NFT 持有者准备空投&#xff0c;快…

[C++]24:异常和智能指针

异常和智能指针 一.异常1.C/C的错误&#xff1a;1.C2.C3.三个关键字&#xff1a; 2.使用异常&#xff1a;1.基本概念&#xff1a;2.基本代码&#xff1a;1.基本使用&#xff1a;2.多个捕获&#xff1a;3.任意类型异常的捕获&#xff1a;4.异常的重新抛出&#xff1a; 3.异常安全…

RK3568技术笔记十八 Linux GPIO驱动程序中设备树分析

这段代码是RK3568芯片的设备树&#xff08;Device Tree&#xff09;片段&#xff0c;用于描述GPIO控制器的配置。 pinctrl: pinctrl { compatible "rockchip,rk3568-pinctrl"; // 兼容性字符串&#xff0c;指定此设备树节点适用于RK3568的引脚控制器 rockchip,grf…

汽车信息安全--HSM和TEE的区别

目录 HSM TEE TEE 和 HSM 技术特点与主要应用场景 TEE 和 HSM 相结合的方案 TEE 和 HSM 在车端的分布 HSM HSM指Hardware Security Module&#xff0c;它是一种有自己独立的CPU、密码算法硬件加速器、独立Flash等&#xff0c;用于生成、存储和管理加密密钥&#xff0c;以…

2024年商业管理与金融创新国际会议(BMFI 2024)

2024年商业管理与金融创新国际会议&#xff08;BMFI 2024&#xff09; 2024 International Conference on Business Management and Financial Innovation 【重要信息】 大会地点&#xff1a;上海 大会官网&#xff1a;http://www.icbmfi.com 投稿邮箱&#xff1a;icbmfisub-co…

高并发cn.hutool.http.HttpRequest请求优化

高并发cn.hutool.http.HttpRequest请求优化 文章目录 高并发cn.hutool.http.HttpRequest请求优化优化方向Async线程池管理Http请求处理流程Tomcat接收到请求后的处理流程Tomcat的线程分配和管理方案一方案二方案三如何启用Spring Boot Actuator 优化方向 Async线程池管理 使用…

用户态协议栈06-TCP三次握手

最近由于准备软件工程师职称考试&#xff0c;然后考完之后不小心生病了&#xff0c;都没写过DPDK的博客了。今天开始在上次架构优化的基础上增加TCP的协议栈流程。 什么是TCP 百度百科&#xff1a;TCP即传输控制协议&#xff08;Transmission Control Protocol&#xff09;是…

24 常用到的截图工具

1 语录 从此世界在我面前&#xff0c; 指向着我想去的任何地方&#xff0c; 我完全而绝对的主持着我 定义&#xff1a; 截图是将计算机屏幕上的当前显示内容保存为图片文件的行为。 概念&#xff1a; 全屏截图&#xff1a;捕捉整个屏幕的截图。区域截图&#xff1a;选择屏幕上…

【第十四课】区域经济可视化——标注

一、前言 地图上说明图面要素的名称、质量与数量特征的文字或数字&#xff0c;统称为地图 注记。只有图形符号而没有注记符号的地图&#xff0c;只能是一种令人费解的 “盲图”。 地图上的注记分为名称注记、说明注记和数字注记三种。名称注记用于说明各 种事物的专有名称&…

怎么使用RSI指标分析现货黄金行情走势?

拿到一波现货黄金行情走势&#xff0c;如何着手对其进行分析呢&#xff1f;投资者只要在网络上搜索一下&#xff0c;保管能够找到各种各样的答案&#xff0c;而本文要讨论的就是其中一种&#xff0c;我们借助RSI指标进行分析。 RSI就是相对强弱指标的简称&#xff0c;这是市场中…

车间现场管理那些事

在制造企业中&#xff0c;车间现场管理是至关重要的一环。车间现场管理包括了对生产设备、生产过程、产品质量以及员工行为的管理。有效的车间现场管理能够提高生产效率&#xff0c;降低成本&#xff0c;提高产品质量&#xff0c;并且能够保障员工的安全。那么&#xff0c;车间…

License简介和Licensecc的使用

License简介和Licensecc的使用 License简介什么是LIcense简易License制作加密扫盲对称加密非对称加密 Licensecc使用构建和编译在linux上进行编译UbuntuCentOS 7CentOS 8下载并编译配置编译和测试cmake 后可以跟的参数在Linux上为Windows进行交叉编译 在windos上进行编译MSVC (…

Linux 运维王者从不离手的10款工具

运维工程师在日常工作中频繁运用的10款工具&#xff0c;并细致阐述每款工具的功能、适用场景以及其卓越之处。 1. Shell脚本 功能&#xff1a;主要用于自动化任务和批处理作业。 适用场景&#xff1a;频繁用于文件处理、系统管理、简单的网络管理等操作。 优势&#xff1a;灵…

原装GUVCL-T10GD韩国GENICOM光电二极管紫外线传感器原厂代理商

深圳市宏南科技有限公司是韩国GenUV公司的原厂代理商&#xff0c;所售紫外线传感器均来自于原始生产厂商直接供货&#xff0c;非第三方转售。 GUVCL-T10GD 韩国GENICOM光电二极管光传感器 / 低亮度 / 紫外线 UV-C传感器 GUVCL-T10GD 采用基于氮化铟的材料 肖特基型 光电二极管…

竞赛选题 python 机器视觉 车牌识别 - opencv 深度学习 机器学习

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于python 机器视觉 的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 &#x1f9ff; 更多资…

机器学习之Kmeans丨集成学习丨决策树测试

选择题 下面属于决策树的后剪枝的是&#xff1f;【 正确答案: A】 A. 把数据集分成测试集和训练集&#xff0c;用测试集构建一个足够大的决策树&#xff0c;用测试集判断叶节点合并是否能降低误差。 B. 当树到达一定深度的时候停止生长。 C. 当前节点的样本数量小于某个阈值时&…