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

news2024/11/25 8:21:58

目录

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/1846012.html

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

相关文章

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 06:危险的行业

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

Mac安装多个jdk环境(jdk8+jdk17)保姆级

Mac安装多个jdk环境&#xff08;jdk8jdk17&#xff09;保姆级 背景&#xff1a;新机安装开发环境发现需要找很多文章&#xff0c;&#xff0c;&#xff0c;&#xff0c;这里一篇文章安装所有环境 文章目录 Mac安装多个jdk环境&#xff08;jdk8jdk17&#xff09;保姆级&#x1f…

基于springboot实现火车票订票系统项目【项目源码+论文说明】

基于springboot实现火车票订票系统演示 摘要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装火车票订票系统软件来…

【SpringCloud】Eureka的简单使用

本文使用的是jdk17&#xff0c;mysql8。 以下用两个服务做演示&#xff1a; 订单服务&#xff1a;提供订单ID&#xff0c;获取订单详细信息。 商品服务&#xff1a;提供商品ID&#xff0c;获取商品详细信息。 对于上篇http://t.csdnimg.cn/vcWpo 订单服务调用商品服务的时候&a…

一文读懂 HTTP 和 RPC 的区别

随着互联网技术的发展&#xff0c;网络通信在各种应用中扮演着至关重要的角色。无论是构建 Web 应用还是进行服务之间的交互&#xff0c;选择合适的通讯协议成为开发者们需要深入思考的问题。在众多协议中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff09;…

JavaSE 面向对象程序设计进阶 抽象类和接口 2024年详解

目录 抽象类 抽象方法 抽象类和抽象方法的注意事项 ​编辑 接口 如何定义接口 注意 代码实现 ​编辑 接口中的成员特点 接口和类之间的关系 1.类与类的关系 2.类与接口的关系 3.接口与接口的关系 ​编辑 拓展 接口中的默认方法 接口中的静态方法 ​编辑 接口…

全新升级微信分销商城小程序源码系统 前后端分离 带完整的安装代码包以及搭建部署教程

系统概述 微信分销商城小程序源码系统是基于先进的技术和理念开发而成的。它旨在为企业和商家打造一个功能齐全、用户体验良好的分销平台&#xff0c;帮助他们更好地管理商品、销售渠道和用户关系&#xff0c;实现业务的快速增长和持续发展。 代码示例 系统特色功能一览 1.多…

TikTok API接口——获取TikTok用户QRcode二维码

一、引言 在数字化时代&#xff0c;QRcode二维码已经成为连接线上线下的重要桥梁。在社交媒体领域&#xff0c;TikTok作为短视频领域的佼佼者&#xff0c;用户量庞大且活跃度高。为了满足用户之间更便捷的互动需求&#xff0c;我们特别开发了一款针对TikTok平台的接口&#xf…

C++并发之协程实例(二)(计算斐波那契序列)

目录 1 协程2 实例-计算斐波那契序列2.1 斐波那契序列2.2 代码 3 运行 1 协程 协程(Coroutines)是一个可以挂起执行以便稍后恢复的函数。协程是无堆栈的&#xff1a;它们通过返回到调用方来暂停执行&#xff0c;并且恢复执行所需的数据与堆栈分开存储。这允许异步执行的顺序代码…

[图解]企业应用架构模式2024新译本讲解15-行数据入口

1 00:00:01,060 --> 00:00:02,770 数据算完了 2 00:00:03,070 --> 00:00:07,720 接下来就是我们这一节的主要内容了 3 00:00:08,500 --> 00:00:13,630 应用服务调用第三方的&#xff0c;Email 4 00:00:13,640 --> 00:00:18,280 包括集成应用的接口来发Email 5 …

【C++】————类和对象(上)

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月21日 一、类与对象的初步认识 1、类其实就是对对象的抽象&#xff0c;而对象就是对类的具体实例 类不占用内存&#xff0c;而对象占用内存。 2、面向对象与面向过程 C语言是面…

技术探索:如何利用合合信息智能文档处理提升审查效率

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 智能文档处理技术是一系列技术的集合&#xff0c;旨在自动化地捕获、理解、处理和分析文档内容&#xff0c;以支持企业的数字化转型和提升文档处理效率。 智能文档处理技术的核心包括光学字符识别&#xff08;O…

【码银送书第二十一期】《大数据智能风控:模型、平台与业务实践》

人行印发的《金融科技&#xff08;FinTech&#xff09;发展规划&#xff08;2022一2025年&#xff09;》明确指出金融科技成为防范化解金融风险的利器&#xff0c;运用大数据、人工智能等技术建立金融风控模型&#xff0c;有效甄别高风险交易&#xff0c;智能感知异常交易&…

光电数鸡算法《java》

一&#xff1a;需求 题目&#xff1a;一条流水线有工位D1,D2,D3…D20,总共20个工位。 每个工位都装有一个光电计数器&#xff0c;每个工位都为本工位的计数减去前一个工位&#xff08;第一个有数值的工位除外&#xff0c;不计算。&#xff09; 计算规则&#xff1a;比如D1,D2都…

Android CTS环境搭建

CTS即Compatibility Test Suite意为兼容性测试&#xff0c;是Google推出的Android平台兼容性测试机制。其目的是尽早发现不兼容性&#xff0c;并确保软件在整个开发过程中保持兼容性。只有通过CTS认证的设备才能合法的安装并使用Google market等Google应用。 搭建CTS测试环境需…

计算机网络:应用层 - 域名系统 DNS

计算机网络&#xff1a;应用层 - 域名系统 DNS 域名结构域名服务器域名解析迭代查询递归查询 互联网中的每台设备都有一个唯一的IP地址&#xff0c;但这些地址通常是复杂的数字组合&#xff0c;例如 172.217.160.142&#xff0c;难以记忆和识别。域名系统将这些复杂的IP地址与易…

通过腾讯云TDSQL TCPTCE(MySQL版)认证考试秘籍宝典

腾讯云TDSQL(MySQL版)交付运维高级工程师TCCP证书展示 腾讯云TDSQL(MySQL版)交付运维专家TCCE考试成绩、证书展示 认证类型与级别 TCCA:入门级(初级) TCCP:高级(中级) TCCE:专家级(高级) 考试形式 考试是在线考试&#xff0c;考生需要在腾讯云大学官网上完成。 腾讯云TDSQ…

【会议征稿】2024年应用计算智能、信息学与大数据国际会议(ACIIBD 2024,7月26-28)

2024年应用计算智能、信息学与大数据国际学术会议&#xff08;ACIIBD 2024&#xff09;将于2024年7月26-28日在中国广州举办。会议将聚焦于计算智能及其应用、信息、大数据等相关的研究领域&#xff0c; 广泛邀请国内外知名专家学者&#xff0c;共同探讨相关学科领域的最新发展…

深入理解和实现Windows进程间通信(信号量)

常见的进程间通信方法 常见的进程间通信方法有&#xff1a; 管道&#xff08;Pipe&#xff09;消息队列共享内存信号量套接字 下面&#xff0c;我们将详细介绍信号量的原理以及具体实现。 什么是信号量&#xff1f; 信号量&#xff08;Semaphore&#xff09;是一个非常重要…

【数据库】数据库脚本编写规范(Word原件)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目的 2 SQL书写规范 3 SQL编写原则 软件全套资料获取进主页或者本文末个人名片直接获取。