异常检测的学习和实战

1.应用:

1.在工业上的应用请添加图片描述
当检测设备是否处于异常工作状态时,可以由上图分析得到:那些零散的点对应的数据是异常数据。因为设备大多数时候都是处于正常工作状态的,所以数据点应该比较密集地集中在一个范围内,而那些明显偏出正常范围内的数据点就是我们要找的异常数据了,此时就可以自动

2.在图像里的应用请添加图片描述
通过异常检测,我们也可以检测到图像中的异常图像。(如上图中的小红鱼)
此外,异常检测的应用还有很多,比如:
异常消费检测(商业)
缺陷基因检测(医疗)
劣质产品检测(工业)等等

2.对于异常检测的定义:

根据输入的数据,对不符合预期模式的数据进行识别

3.介绍:

假设我们有一个一维的数据集,在这个数据集中有m个样本:请添加图片描述
数据在x轴的分别如下图:
请添加图片描述
我们的目标是自动地找出这上面的异常样本,就可以根据样本在坐标轴上分布的数量多少,计算出坐标轴上各点对应的样本概率密度,可以设定当概率密度小于某个值时,这时其对应的样本就是我们要找的异常样本。——>根据各个样本对应的概率函数计算出来的值画出数据分布,进而判断是否属于异常样本
请添加图片描述
这里说一下高斯分布的概率密度函数:
请添加图片描述
请添加图片描述
根据以上数据我们就可以计算出我们的均值和方差:
请添加图片描述
然后我们将均差和方差带入公式就能算出我们的P(x)了:
请添加图片描述

4.如何根据高斯分布概率去解决异常检测的问题呢?

请添加图片描述
**(第一步)**在我们知道X1、X2……Xm这些数据后,就可以进行相应计算了。

  1. 计算各个数据均值u,标准差σ
  2. 计算对应的高斯分布概率密度函数P(x)
    请添加图片描述

(第二步)计算出来后,数据对应的高斯分布概率密度函数如下图
请添加图片描述
请添加图片描述该点就为异常点
问:如果数据高于一维怎么办?
请添加图片描述
比如这里
n维的数据
每一个维度都有m个样本。若要计算其高斯分布概率密度函数,可按如下步骤:
在这里插入图片描述先计算出每一个维度下对应的均值和标准差了,这样就可以计算每个维度下的概率密度函数
请添加图片描述
我们将计算出的每个维度下的概率密度函数相乘就可以计算出总的概率密度函数了请添加图片描述
最后再根据高维下的概率密度函数判断其是否小于预期就可以判断异常点了请添加图片描述

5.举个例子:

举个例子,下面给出一组二维数据,来判断当x1=3.5,x2=3.5时,对应的点是不是异常点
请添加图片描述
知道了标准差和均值,就可以计算其概率密度函数了请添加图片描述
经计算可判断该点为异常点

很多时候,为了更直观的观察概率密度函数,我们是可以把它画出来的,下图是二维数据下的一个概率密度函数图

请添加图片描述

6.实战代码:

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import matplotlib as mlp  # mlp设置字体
from scipy.stats import norm  # norm计算高斯分布概率函数
from sklearn.covariance import EllipticEnvelope  # EllipticEnvelope模型专门做异常检测的# 1.预览数据
data = pd.read_csv('D:/pythonDATA/anomaly_data.csv')
print(data.head())
# 2.进行数据分布可视化
fig1 = plt.figure(figsize=(10, 7))
x1 = data.loc[:, 'x1']
x2 = data.loc[:, 'x2']font2 = {'family': 'SimHei', 'weight': 'normal', 'size': '20'}  # 定义一下字体(根据自己喜好定义即可)
mlp.rcParams['font.family'] = 'SimHei'  # 设置字体
mlp.rcParams['axes.unicode_minus'] = False  # 字符显示fig2 = plt.figure(figsize=(20, 7))plt.subplot(121)  # 子图一行二列所属第一列(画x1)
plt.hist(x1, bins=100)  # 分成100个数据分隔,即有100条条状图
plt.title('x1 数据分布统计', font2)
plt.xlabel('x1', font2)
plt.ylabel('出现次数', font2)plt.subplot(122)  # 子图一行二列所属第二列(画x2)
plt.hist(x2, bins=100)  # 分成100个数据分隔
plt.title('x2 数据分布统计', font2)
plt.xlabel('x2', font2)
plt.ylabel('出现次数', font2)
plt.show()# 3.计算x1、x2的均值(mean)和标准差(sigma)
print("计算x1,x2的mean均值和标准差sigma")
x1_mean = x1.mean()
x1_sigma = x1.std()
x2_mean = x2.mean()
x2_sigma = x2.std()
print(x1_mean, x1_sigma, x2_mean, x2_sigma)# 4.计算高斯分布概率密度函数
x1_range = np.linspace(0, 20, 300)  # x1值得范围是0到20,300个点均分
x1_normal = norm.pdf(x1_range, x1_mean, x1_sigma)  # 计算高斯分布概率密度函数x_normal
x2_range = np.linspace(0, 20, 300)
x2_normal = norm.pdf(x2_range, x2_mean, x2_sigma)# 5.可视化高斯分布概率密度函数
fig3 = plt.figure(figsize=(20, 7))
plt.subplot(121)
plt.plot(x1_range, x1_normal)  # 可视化分布概率函数(x1的值切分做x,高斯分布概率函数作y)
plt.title('normal p(x1)')
plt.subplot(122)
plt.plot(x2_range, x2_normal)  # 可视化分布概率函数(x2的值切分作为x轴,y轴为高斯分布概率函数)
plt.title('normal p(x2)')
plt.show()
# 6.建立模型
ad_model = EllipticEnvelope(contamination=0.03)  # 默认阈值是0.1,我们修改为0.03观察变化
ad_model.fit(data)
# 7.预测
y_predict = ad_model.predict(data)
print(pd.value_counts(y_predict))
y_predict = np.array(y_predict)# 可视化结果
fig4 = plt.figure(figsize=(10, 6))
orginal_data = plt.scatter(data.loc[:, 'x1'], data.loc[:, 'x2'], marker='x')  # 将各点用'x'表示
anomaly_data = plt.scatter(data.loc[:, 'x1'][y_predict == -1], data.loc[:, 'x2'][y_predict == -1], marker='o',facecolor='none', edgecolor='red', s=150)
# y_predict==-1即是异常点; marker='o'将异常点用圆圈圈起来; facecolor='none' 不填充,即空心圆; edgecolor='red' 颜色为红色; s=150 圆圈的大小.
plt.title('自动寻找异常数据', font2)
plt.xlabel('x1', font2)
plt.ylabel('x2', font2)
plt.legend((orginal_data, anomaly_data), ('原数据', '检测异常点'))
plt.show()

数据分布图:
在这里插入图片描述

高斯概率分布图:
在这里插入图片描述
异常数据分布图:
在这里插入图片描述

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

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

相关文章

Transformer模型详解03-Self-Attention(自注意力机制)

文章目录 简介基础知识什么是AttentionSelf Attention原理通俗易懂理解矩阵计算Q,K,V计算Self-Attention 的输出 优势 Multi-head self-attention原理通俗易懂理解矩阵计算代码实现 简介 下图是论文中 Transformer 的内部结构图,左侧为 Enco…

基于ChatGLM+Langchain离线搭建本地知识库(免费)

目录 简介 服务部署 实现本地知识库 测试 番外 简介 ChatGLM-6B是清华大学发布的一个开源的中英双语对话机器人。基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT…

信息系统架构模型_2.面向服务架构(SOA)模式

前面讲的客户机/服务器模式,无论多少层的C/S软件结构,对外来讲,都只是一个单结点应用(无论它由多个不同层的“服务”相互配合来完成其功能),具体表现为一个门户网站、一个应用系统等。而多个单点应用相互通…

浅析SPI接口

SPI是串行外设接口(Serial Peripheral Interface)的缩写,它是一种同步串行通信接口,用于微控制器和外围设备(如传感器、SD卡、其他微控制器等)之间的通信。SPI接口通常用于短距离通信,因为它不支…

VR全景技术在养老院的应用优势浅析

随着时代的快速发展,人口老龄化越来越严重,如何利用VR技术提升养老服务的质量,成为了社会各界关注的焦点。为养老院拍摄制作VR全景,不仅能够为养老院的老人子女们跨越空间限制,实现与家人的情感连接,还可以…

The 2023 ICPC Asia Hefei Regional Contest

目录 B. Queue Sorting 应该还会再补几题 B. Queue Sorting 题解: Dilworth定理: 【偏序关系与偏序集、Hasse图、极大元、极小元、全序关系、最大元、良序集/三小时讲不完离散数学之集合论/考研复试/期末复习考前冲刺/近世代数/抽象代数】https://www.bilibili.c…

NX二次开发,在指定的装配节点下新建或者添加组件

目录 一、概述 二、存在的问题 三、在指定的装配节点下新建或者添加组件的实现 四、结果显示 一、概述 最近学习装配内容,说一说体会吧,用起来很爽,开发起开是真的别扭啊,而且,网上可以收到的关于装配的知识有很多…

element 输入框禁止输入空格以及复制的值进去删除空格(vue自定义指令)开箱即用

实例图: 代码: //输入框禁止输入空格 Vue.directive(noSpace, {bind(el) {//禁止输入空格el.addEventListener("keydown", function (event) {if (event.keyCode 32) {event.preventDefault();}});//复制值时去掉空格el.addEventListener(&q…

PY32F403系列单片机,32位M4内核MCU,主频最高144MHZ

PY32F403系列单片机是基于Arm Cortex-M4核的32位通用微控制器产品。内置的FPU和DSP功能支持浮点运算和全部DSP指令。通过平衡成本,性能,功耗来获得更好的用户体验。 PY32F403单片机典型工作频率可达144MHZ,内置高速存储器,丰富的…

Android Studio连接MySQL8.0

【序言】 移动平台这个课程要做一个app的课设,我打算后期增加功能改成毕设,就想要使用MySQL来作为数据库,相对于SQLlite来说,我更熟悉MySQL一点。 【遇到的问题】 一直无法连接上数据库,开始的时候查了很多资料&#…

【C语言】/*操作符(上)*/

目录 一、算数操作符:、-、*、/、% 1.1 和 - 1.2 * 1.3 / 1.4 % 二、赋值操作符: 和符合赋值 2.1 连续赋值 2.2 复合赋值(自操作) 三、单目操作符:、--、(正号)、-(负号) 3.1 和 -- 3.1.1 前置 3.1.2 后置 3.1.3 前置-- …

【RAG 论文】Contriever:对比学习来无监督训练文本嵌入模型

论文:Unsupervised Dense Information Retrieval with Contrastive Learning ⭐⭐⭐⭐⭐ Facebook Research, arXiv:2112.09118 Code:github.com/facebookresearch/contriever 一、论文速读 本文使用对比学习的方法来对文本检索模型做无监督学习训练&am…