Python异常检测 - LSTM(长短期记忆网络)

news2024/11/5 9:18:23

系列文章目录

Python异常检测- Isolation Forest(孤立森林)
python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS)
python异常检测-局部异常因子(LOF)算法
Python异常检测- DBSCAN
Python异常检测- 单类支持向量机(One-Class SVM)
Python异常检测-3Sigma
Python异常检测-K最近邻算法(KNN)
Python异常检测-主成分分析(PCA)
python异常检测-ARIMA(自回归积分滑动平均模型)
Python异常监测- 包络线


文章目录

  • 系列文章目录
  • 前言
  • 一、 LSTM(长短期记忆网络)
    • 1.1 记忆单元
    • 1.2 遗忘门
    • 1.3 输入门
    • 1.4 输出门
  • 二、LSMT的优缺点
  • 三、LSTM的应用场景
  • 四、python的实现
    • 4.1. 数据准备
    • 4.2. 构建 LSTM 模型
    • 4.3. 训练模型
    • 4.4. 异常检测
    • 4.5. 结果分析


前言

在时间序列分析中,异常值检测是一个重要的任务,它可以帮助我们发现数据中的异常情况,比如突发的异常波动、异常值等。

一、 LSTM(长短期记忆网络)

RNN:RNN(Recurrent Neural Network)循环神经网络,RNN 的神经网络单元不但与输入和输出存在联系,而且自身也存在一个循环 / 回路 / 环路 / 回环 (loop)。这种回路允许信息从网络中的一步传递到下一步。因此RNN中,上一个时刻的网络状态将会作用于到下一个时刻的网络状态,同时这也表明 RNN 和序列数据密切相关。
参考文献中,对RNN的展开和收起有一个简单的图示:
在这里插入图片描述

**梯度消失或梯度爆炸:**在训练过程中,随着网络深度增加,梯度会逐渐减小至零(梯度消失)或无限增大(梯度爆炸),导致网络难以训练。

LSTM,全称为Long Short-Term Memory(长短期记忆网络),是一种特殊的循环神经网络(Recurrent Neural Network, RNN)。LSTM最初由Hochreiter和Schmidhuber于1997年提出,主要是为了解决传统RNN在处理长序列数据时遇到的梯度消失或梯度爆炸问题。

下图一和图二是关于经典RNN结构与LSTM结构对比图,从结构上,可以看出,LSTM是一种特殊的RNN,两者的区别在于普通的RNN单个循环结构内部只有一个状态。而LSTM的单个循环结构(又称为细胞)内部有四个状态。
RNN结构
图一: RNN结构
LSTM结构
图二: LSTM结构

通过结构图的对比,可以看出LSTM单元要复杂许多。每个LSTM单元中包含了4个交互的网络层,这个四层结构的网络层主要包括如下内容:

  • 记忆单元(Memory Cell):记忆单元是LSTM的核心部分,它能够存储信息,并通过门控机制来控制信息的流入、流出以及保持。
  • 遗忘门(Forget Gate):遗忘门决定上一时刻的单元状态有多少需要保留到当前时刻。
  • 输入门(Input Gate):输入门决定当前时刻网络的输入数据有多少需要保存到单元状态。
  • 输出门(Output Gate):输出门决定了控制当前单元状态有多少需要输出到当前的输出值。

1.1 记忆单元

记忆细胞提供了记忆的功能,在网络结构加深时仍能传递前后层的网络信息。参考文件中给出了下图,示例是最简单的模式,采用的是函数只有两个sigmod 和tanh神经网络层。其中红色部分就是记忆单元的表示,输入数据在结合遗忘门,输入门数据后进行相应的输出。
在这里插入图片描述

1.2 遗忘门

遗忘门的作用是要决定从记忆细胞c中是否丢弃某些信息,即at-1中有多少信息进行保留。参考文件中的图片很清晰的表明其在单元中的位置,基于上图的示例,可以通过一个 Sigmoid函数来进行处理。
在这里插入图片描述

1.3 输入门

输入门的作用就是往状态信息中添加新东西,输入门包含记忆细胞候选值和更新门两个元素,同时使用了两个神经元函数。参考文件中对其位置的说明如下图。

在这里插入图片描述

1.4 输出门

输出门是输出的记忆,也就是前面的积累。首先,通过 tanh 进行记忆单元的输出进行处理,它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分,最后通过运行一个 softmax 层来过滤后,确定细胞状态的哪个部分将输出出去。
在这里插入图片描述

二、LSMT的优缺点

通义千问对LSTM的优缺点的总结信息如下:
优点

  • 解决长期依赖问题:LSTM通过其独特的结构设计,特别是输入门、遗忘门和输出门的设计,能够有效地捕捉长时间间隔的信息依赖关系,这是标准RNN难以做到的。

  • 防止梯度消失/爆炸:由于LSTM内部状态的传递方式,它能够在训练过程中较好地保持梯度的稳定,从而避免了梯度消失或梯度爆炸的问题。

  • 灵活的模型能力:LSTM可以适应多种类型的序列数据,包括但不限于自然语言处理、语音识别、时间序列预测等领域。

  • 并行计算能力:虽然LSTM本质上是一个序列模型,但是它可以通过一些技巧实现一定程度上的并行化计算,提高训练效率。

缺点

  • 计算成本高:相比于简单的RNN模型,LSTM的参数量更多,因此在训练和推理时需要更多的计算资源和时间。

  • 过拟合风险:由于LSTM具有较强的表达能力,如果数据集较小或正则化手段不当,容易发生过拟合现象。

  • 调参复杂:LSTM中存在多个超参数需要调整,如学习率、隐藏层单元数、层数等,这使得模型调优变得更加困难。

  • 解释性较差:尽管LSTM在很多任务上表现优秀,但它属于黑盒模型,内部的工作机制对于非专业人士来说难以理解,这限制了其在某些需要高度可解释性的领域的应用。

三、LSTM的应用场景

LSTM作为一种先进的深度学习模型,其在多个领域的应用都展现了其强大的数据处理能力和灵活性,其主要应用场景包括:

  • 自然语言处理(NLP):LSTM在文本生成、机器翻译、语音识别等领域表现突出。例如,Google翻译使用的就是基于LSTM的模型[1]。
  • 时间序列预测:LSTM能够捕捉时间序列中的时间依赖性,适用于股票价格预测、天气预测等场景。
  • 视频分析:在视频内容分析和动作识别中,LSTM可以有效地处理视频帧之间的时序关系。
  • 生物信息学:在DNA序列分析、蛋白质结构预测等生物信息学领域,LSTM也显示出了强大的能力。
  • 音乐创作:LSTM被用于生成音乐和作曲,能够学习音乐的风格并进行创作。
  • 机器人技术:在机器人路径规划和控制系统中,LSTM可以帮助机器人更好地理解和预测环境变化。
  • 游戏AI:在电子游戏中,LSTM可以用来开发更智能的NPC对手或队友。

随着技术的不断进步,LSTM在未来的应用前景将更加广阔。

四、python的实现

4.1. 数据准备

首先,需要准备你的时序数据。通常,这包括数据的收集、清洗和预处理。对于异常检测任务,你可能需要将原始数据转换为监督学习问题的形式,即创建输入-输出对。
本实例通过从csv中读取两列数据的方案来实现。

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

# 加载数据
data = pd.read_csv('your_data.csv')

# 选择特征列
features = data[['feature1', 'feature2']]

# 数据归一化
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_features = scaler.fit_transform(features)

# 创建数据集
def create_dataset(data, time_step=1):
    X, Y = [], []
    for i in range(len(data)-time_step-1):
        a = data[i:(i+time_step), 0]
        X.append(a)
        Y.append(data[i + time_step, 0])
    return np.array(X), np.array(Y)

time_step = 60  # 可以根据具体需求调整
X, y = create_dataset(scaled_features, time_step)

4.2. 构建 LSTM 模型

接下来,构建一个简单的 LSTM 模型来学习时序数据中的模式。

from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout

model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(time_step, scaled_features.shape[1])))
model.add(LSTM(50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mean_squared_error')

4.3. 训练模型

使用训练集数据训练模型。为了防止过拟合,可以设置验证集来监控模型在未见过的数据上的表现。

history = model.fit(X, y, epochs=100, batch_size=64, validation_split=0.1, verbose=1)

4.4. 异常检测

训练完成后,可以通过计算预测值与实际值之间的误差来进行异常检测。较大的误差可能指示异常点。

# 使用模型预测
train_predict = model.predict(X)

# 反向转换预测值
train_predict = scaler.inverse_transform(train_predict)
y_true = scaler.inverse_transform(y.reshape(-1, 1))

# 计算误差
errors = np.abs(y_true - train_predict)

# 定义阈值来判断是否为异常
threshold = np.percentile(errors, 99.75)  # 例如,选择99.75%(3个标准差)分位数作为阈值
anomalies = errors > threshold

4.5. 结果分析

最后,你可以通过可视化或其他方法来检查哪些数据点被认为是异常的。

import matplotlib.pyplot as plt

plt.figure(figsize=(14, 5))
plt.plot(y_true, label='True value')
plt.plot(train_predict, label='Predicted value')
plt.scatter(np.where(anomalies)[0], y_true[anomalies], c='r', label='Anomaly')
plt.legend()
plt.show()

参考
Python LSTM时间序列异常值检测
深入理解LSTM
最简单的LSTM讲解,多图展示,源码实践,建议收藏
神经网络 | CNN 与 RNN——深度学习主力军

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

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

相关文章

【双指针】【数之和】 LeetCode 633.平方数之和

算法思想&#xff1a; 双指针枚举i,j&#xff1b;类似三数之和 class Solution { public:bool judgeSquareSum(int c) {long long sum0;vector<int> dp;dp.push_back(0);long long start1;while(sum < c){sum start *start;if(sum>c) break;else dp.push_back(…

前端Nginx的安装与应用

目录 一、前端跨域方式 1.1、CORS(跨域资源共享) 1.2、JSONP(已过时) 1.3、WebSocket 1.4、PostMessage 1.5、Nginx 二、安装 三、应用 四、命令 4.1、基本操作命令 4.2、nginx.conf介绍 4.2.1、location模块 4.2.2、反向代理配置 4.2.3、负载均衡模块 4.2.4、通…

Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口

本示例的目的是介绍如何在vue+openlayers中使用extent,使用feature fit的方式来适配窗口。当加载到页面上几个图形要充分展示在窗口的时候,可以用这种方式来平铺到页面中。 效果图 专栏名称内容介绍Openlayers基础实战 (72篇)专栏提供73篇文章,为小白群体提供基础知识及示…

每日OJ题_牛客_相差不超过k的最多数_滑动窗口_C++_Java

目录 牛客_相差不超过k的最多数_滑动窗口 题目解析 C代码 Java代码 牛客_相差不超过k的最多数_滑动窗口 相差不超过k的最多数_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a; 给定一个数组&#xff0c;选择一些数&#xff0c;要求选择的数中任意两数差的绝对值不超过 …

初始JavaEE篇——多线程(5):生产者-消费者模型、阻塞队列

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势&#xff1a;生产者—消费者模型的劣势&#xff1a; Java标准库中的阻…

后端eclipse——文字样式:UEditor富文本编辑器引入

目录 1.富文本编辑器的优点 2.文件的准备 3.文件的导入 导入到项目&#xff1a; 导入到html文件&#xff1a; ​编辑 4.富文本编辑器的使用 1.富文本编辑器的优点 我们从前端写入数据库时&#xff0c;文字的样式具有局限性&#xff0c;不能存在换行&#xff0c;更改字体…

Rust移动开发:Rust在Android端集成使用介绍

Andorid调用Rust 目前Rust在移动端上的应用&#xff0c;一般作为应用sdk的提供&#xff0c;供各端使用&#xff0c;目前飞书底层使用Rust编写通用组件。 该篇适合对Android、Rust了解&#xff0c;想看如何做整合&#xff0c;如果想要工程源码&#xff0c;可以评论或留言有解疑…

推荐一款高级的安装程序打包工具:Advanced Installer Architect

AdvanCEd Installer Architect是一款高级的安装程序打包工具&#xff0c;我们有时候可能用nsis用的多&#xff0c;Advanced Installer Architect也是一款打包工具&#xff0c;有兴趣的朋友也可以试试。有了Advanced Installer Architect你就可以创建MSI打包。 主要功能 *先进的…

关于Linux系统调试和性能优化技巧有哪些?

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于Linux系统调试和性能优化技巧的相关内容…

MySQL中,GROUP BY 分组函数

文章目录 示例查询&#xff1a;按性别分组统计每组信息示例查询&#xff1a;按性别分组显示详细信息示例查询&#xff1a;按性别分组并计算平均年龄,如果你还想统计每个性别的平均年龄&#xff0c;可以结合AVG()函数&#xff1a;说明 示例查询&#xff1a;按性别分组统计每组信…

Docker:容器编排 Docker Compose

Docker&#xff1a;容器编排 Docker Compose docker-composedocker-compose.ymlservicesimagecommandenvironmentnetworksvolumesportshealthcheckdepends_on 命令docker compose updocker compose down其它 docker-compose 多数情况下&#xff0c;一个服务需要依赖多个服务&a…

.net Core 使用Panda.DynamicWebApi动态构造路由

我们以前是通过创建controller来创建API&#xff0c;通过controller来显示的生成路由&#xff0c;这里我们讲解下如何不通过controller&#xff0c;构造API路由 安装 Panda.DynamicWebApi 1.2.2 1.2.2 Swashbuckle.AspNetCore 6.2.3 6.2.3添加ServiceAction…

交换机如何实现2.5G网络传输速率和网络变压器有关吗

华强盛电子导读&#xff1a;I19926430038 交换机实现2.5G网络传输速率涉及多个因素&#xff0c;其中包括硬件设计、端口支持、传输介质以及网络协议等。网络变压器在其中扮演了一个重要的角色&#xff0c;但并不是唯一的因素。 1. **硬件设计**&#xff1a;交换机需要有支持2.…

Chrome 130 版本开发者工具(DevTools)更新内容

Chrome 130 版本开发者工具&#xff08;DevTools&#xff09;更新内容 一、网络&#xff08;Network&#xff09;面板更新 1. 重新定义网络过滤器 网络面板获新增了一些过滤条件&#xff0c;这些过滤条件是根据反馈重新设计的&#xff0c;特定于类型的过滤条件保持不变&…

JAVA设计模式之【建造者模式】

1 定义 建造者模式&#xff08;Builder Pattern&#xff09;使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 2 类图 产品类&#xff08;Product&#xff09;&#xff1a;表示被创建的复杂…

百度如何打造AI原生研发新范式?

&#x1f449;点击即可下载《百度AI原生研发新范式实践》资料 2024年10月23-25日&#xff0c;2024 NJSD技术盛典暨第十届NJSD软件开发者大会、第八届IAS互联网架构大会在南京召开。本届大会邀请了工业界和学术界的专家&#xff0c;优秀的工程师和产品经理&#xff0c;以及其它行…

算法|牛客网华为机试31-40C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试21-30C 文章目录 HJ31 单词倒排HJ32 密码截取HJ33 整数与IP地址间的转换HJ34 图片整理HJ35 蛇形矩阵HJ36 字符串加密HJ37 统计每个月兔子的总数HJ38 求小球落地5次后所经历的路程和第5次反弹的高度HJ39 判断两个IP是否属于同…

UI自动化测试 —— CSS元素定位实践!

前言 自动化测试元素定位是指在自动化测试过程中&#xff0c;通过特定的方法或策略来准确识别和定位页面上的元素&#xff0c;以便对这些元素进行进一步的操作或断言。这些元素可以是文本框、按钮、链接、图片等HTML页面上的任何可见或不可见的组件。 在自动化测试中&#xf…

【实战篇】requests库 - 有道云翻译爬虫 【附:代理IP的使用】

目录 〇、引言一、目标二、请求参数分析三、响应分析四、编写爬虫脚本【隧道代理的使用】 〇、引言 无论是学习工作、旅游出行、跨境电商、日常交流以及一些专业领域都离不开翻译工具的支持。本文就带大家通过爬虫的方式开发一款属于自己的翻译工具~ 一、目标 如下的翻译接口…

Spring框架的声明式事务

目录 一.配置文件的方式 1.配置文件 2.业务层 3.持久层 4.测试类 5.运行 6.查看数据库 7.出现异常运行 二.半注解的方式 1.配置文件 2.db.properties 3.持久层 4.业务层 5.测试类 6.运行 7.查看数据库 8.加上异常 三.纯注解的方式 1.持久层 2.业务层 3.配置…