(论文复现)DeepAnt模型复现及应用

news2024/12/29 13:21:03

DeepAnt论文如下,其主要是用于时间序列的无监督粗差探测

 

其提出的模型架构如下:

        该文提出了一个无监督的时间序列粗差探测模型,其主要有预测模块和探测模块组成,其中预测模块的网络结构如下。
       预测结构是将时间序列数据组织成数据集之后经过两次的卷积和最大池化,最后将卷积结果通过一个全连接层转换为一个输出数据(若是单步预测则输出单元个数为1)
       探测模块是将模型的时序预测结果与该时刻的观测数据相比来计算欧氏距离,以此来作为当前时间点距离的异常分数。以此来作为数据粗差探测的标准。

        (本博客主要是分享复现代码,论文中的细节原理可自行下载学习)


 复现代码(数据不便分享):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset,DataLoader,TensorDataset
from sklearn.preprocessing import MinMaxScaler,StandardScaler

def MSE(arr1,arr2):
	arr1,arr2 = np.array(arr1).flatten(),np.array(arr2).flatten()
	assert arr1.shape[0] == arr2.shape[0]
	return np.sum(np.power(arr1-arr2,2)) / arr1.shape[0]

def MAE(arr1,arr2):
	arr1,arr2 = np.array(arr1).flatten(),np.array(arr2).flatten()
	assert arr1.shape[0] == arr2.shape[0]
	return np.sum(np.abs(arr1-arr2)) / arr1.shape[0]

class MyData(Dataset):

	def __init__(self,arr,history_window,predict_len) -> None:
		self.length = arr.flatten().shape[0]
		self.history_window = history_window
		self.dataset_x,self.dataset_y = self.get_dataset(arr,history_window,predict_len)

	def get_dataset(self,arr,history_window,predict_len):
		arr = np.array(arr).flatten()
		N = history_window
		M = predict_len
		dataset_x = np.zeros((arr.shape[0] - N,N))
		dataset_y = np.zeros((arr.shape[0] - N,M))
		for i in range(arr.shape[0] - N):
			dataset_x[i] = arr[i:i+N]
			dataset_y[i] = arr[i+N:i+N+M]
		dataset_x = torch.from_numpy(dataset_x).to(torch.float)
		dataset_y = torch.from_numpy(dataset_y).to(torch.float)
		return (dataset_x,dataset_y)
	
	def __getitem__(self, index):		# 定义方法 data[i] 的返回值
		return (self.dataset_x[index,:],self.dataset_y[index,:])
	
	def __len__(self):					# 获取数据集样本个数
		return self.length - self.history_window


class DeepAnt(nn.Module):
	def __init__(self,lag,p_w):
		super().__init__()
		
		self.convblock1 = nn.Sequential(
			nn.Conv1d(in_channels=1, out_channels=32, kernel_size=3, padding='valid'),
			nn.ReLU(inplace=True),
			nn.MaxPool1d(kernel_size=2)
		)
		
		self.convblock2 = nn.Sequential(
			nn.Conv1d(in_channels=32, out_channels=32, kernel_size=3, padding='valid'),
			nn.ReLU(inplace=True),
			nn.MaxPool1d(kernel_size=2)
		)
		
		self.flatten = nn.Flatten()
		
		self.denseblock = nn.Sequential(
			nn.Linear(32, 40), # for lag = 10
			#nn.Linear(96, 40), # for lag = 20
			#nn.Linear(192, 40), # for lag = 30
			nn.ReLU(inplace=True),
			nn.Dropout(p=0.25),
		)
		self.out = nn.Linear(40, p_w)
		
	def forward(self, x):
		x = x.view(-1,1,lag)
		x = self.convblock1(x)
		x = self.convblock2(x)
		x = self.flatten(x)
		x = self.denseblock(x)
		x = self.out(x)
		return x


def Train(model,data_set,EPOCH,task_id):
	if torch.cuda.is_available():
		device = torch.device('cuda')
		print('cuda is used...')
	else:
		torch.device('cpu')
		print('cpu is used...')
	scale = StandardScaler()
	loss_fn = nn.MSELoss()
	model.to(device)
	loss_fn.to(device)
	train_x,train_y = data_set.dataset_x,data_set.dataset_y
	train_x = scale.fit_transform(train_x)
	train_x = torch.from_numpy(train_x).to(torch.float).to(device)
	train_y = train_y.to(device).to(torch.float)
	torch_dataset = TensorDataset(train_x,train_y)
	optimizer = torch.optim.Adam(model.parameters())
	BATCH_SIZE = 100
	model = model.train()
	train_loss = []
	print('======Start training...=======')
	print(f'Epoch is {EPOCH}\ntrain_x shape is {train_x.shape}\nBATCH_SIZE is {BATCH_SIZE}')
	for i in range(EPOCH):
		loader = DataLoader(dataset=torch_dataset,
									   batch_size=BATCH_SIZE,
									   shuffle=True)
		temp_1 = []
		for step,(batch_x,batch_y) in enumerate(loader):
			out = model(batch_x)
			optimizer.zero_grad()
			loss = loss_fn(out,batch_y)
			temp_1.append(loss.item())
			loss.backward()
			optimizer.step()
			torch.cuda.empty_cache()
		train_loss.append(np.mean(np.array(temp_1)))
		if i % 10 == 0:
			print(f"The {i}/{EPOCH} is end, loss is {np.round(np.mean(np.array(temp_1)),6)}.")
	print('========Training end...=======')
	model = model.eval()
	plt.plot(train_loss)
	pred = model(train_x).cpu().data.numpy()
	print(f'pred shape {pred.shape}')
	plt.figure()
	y = train_y.cpu().data.numpy().flatten()
	print(f'y shape {y.shape}')
	plt.plot(y,c='b',label='True')
	plt.plot(pred,'r',label='pred')
	plt.legend()
	plt.title('Train_result')
	plt.show()
	return pred

if __name__ == "__main__":
	
	data_f = pd.read_csv('HF05_processed.csv')
	data = np.array(pd.DataFrame(data_f)['OT'])
	lag = 10
	dataset = MyData(data,lag,1)
	model = DeepAnt(lag,1)
	res = Train(model,dataset,200,'1')
	data = data[lag:].flatten() 
	plt.plot(data)
	plt.plot(res,c='r')

	err = data - res.flatten()
	anomaly_score = np.sqrt(np.power(err,2))
	plt.figure()
	plt.plot(anomaly_score)

	error_list = []
	threshold = 0.04
	for i in range(anomaly_score.shape[0]):
		if anomaly_score[i] > threshold:
			error_list.append(i)
	print(len(error_list))
	plt.figure()
	plt.plot(data)
	plt.plot(error_list,[data[i] for i in error_list],ls='',marker='x',c='r',markersize=4)
	plt.show()

运行结果:

 

才疏学浅,敬请指正!

欢迎交流:

邮箱:rton.xu@qq.com

QQ:2264787072

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

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

相关文章

mfc100u.dll丢失的多种解决方法分享,最新的修复mfc100u.dll方案

mfc100u.dll丢失可以说是见怪不怪的了,只要经常使用电脑的人,一般都会碰到一两次这种dll文件缺失的情况,今天主要是来给大家讲解一下mfc100u.dll丢失的多种解决方法,让你以后遇到这情况再也不需要头大。 一.mfc100u.dll为啥会丢失…

【论文阅读】UNICORN:基于运行时来源的高级持续威胁检测器(NDSS-2020)

UNICORN: Runtime Provenance-Based Detector for Advanced Persistent Threats NDSS-2020 哈佛大学 Han X, Pasquier T, Bates A, et al. Unicorn: Runtime provenance-based detector for advanced persistent threats[J]. arXiv preprint arXiv:2001.01525, 2020. 源码&…

无人驾驶实战-第九课(预测系统)

PNC PNCPlanning and Control, 其中包括:预测、全局路径规划、计划(决策、路径规划、速度)及控制。 各公司无人驾驶的整体水平 预测 很多无人驾驶的工作都需要给予预测的结果。预测的需求是准确率和实时性,难点是较为少…

利用MMPose进行姿态估计(训练、测试全流程)

前言 MMPose是一款基于PyTorch的姿态分析开源工具箱,是OpenMMLab项目成员之一,主要特性: 支持多种人体姿态分析相关任务:2D多人姿态估计、2D手部姿态估计、动物关键点检测等等更高的精度和更快的速度:包括“自顶向下”…

mybtis-plus分页查询

文章目录 2.2 代码开发2.2.1 设计DTO类2.2.2 封装PageResult2.2.3 Controller层2.2.4 Service层接口2.2.5 Service层实现类2.2.6 Mapper层 3.3 代码实现3.3.1 分页插件配置3.3.2 分页查询实现 2.2 代码开发 2.2.1 设计DTO类 根据请求参数进行封装,在sky-pojo模块中…

macbook 安装 Git 和 安装 Homebrew

使用MacBook 时,需要拉取代码,我们需要使用到 Git,但 MacBook 中并没安装,这里我们分享一下安装过程。其他方式可查看参考文献中的方法。 一、使用终端直接安装 在新版的 MacBook 中,可以使用终端直接安装 Git&#…

【流量、日志分析】常见的web流量分析、windows日志分析

1.web流量分析 1.1 特点 通常会提供一个包含流量数据的 PCAP 文件,有时候也会需要先进行修复或重构传输文件后,再进行分析。 复杂的地方在于数据包里充满着大量无关的流量信息,因此如何分类和过滤数据是我们需要做的。 1.2 流量包修复 例…

Docker网络模型:理解容器网络通信和连接

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

第 357 场力扣周赛题解

A 故障键盘 简单模拟 class Solution { public:string finalString(string s) {string res;for (auto c: s)if (c ! i)res.push_back(c);elsereverse(res.begin(), res.end());return res;} };B 判断是否能拆分数组 区间dp:定义 p i , j p_{i,j} pi,j​表示子数组 n…

预测知识 | 预测模型变量重要性、可视化及论文撰写指南

预测知识 | 预测模型变量重要性、可视化及论文撰写指南 目录 预测知识 | 预测模型变量重要性、可视化及论文撰写指南变量重要性模型可视化论文撰写指南参考资料 变量重要性 关于预测模型变量重要性,大家一定熟悉不过。但如下图所示,其展示上可有进一步优…

ServiceAccount深度解析

ServiceAccount为Pod钟的进程提供身份信息。当用户访问集群时(例如使用kubectl命令的时候),apiserver会将用户认证为一个特定的User Account(目前通常是admin,除非系统管理员自定义了集群配置)。Pod容器中的…

Pytest测试框架2

目录: pytest参数化用例pytest标记测试用例pytest设置跳过、预期失败用例pytest运行用例pytest测试用例调度与运行pytest命令行常用参数python执行pytestpytest异常处理 1.pytest参数化用例 参数化 通过参数的方式传递数据,从而实现数据和脚本分离。…

C++三个线程依次打印abc

代码 #include<iostream> #include<thread> #include<mutex> #include<condition_variable> using namespace std; mutex mtx; condition_variable cv; int flag0; void A(){unique_lock<mutex>lk(mtx);int count0;while(count<10){while(fl…

【工程实践】使用EDA(Easy Data Augmentation)做数据增强

工程项目中&#xff0c;由于数据量不够&#xff0c;经常需要用到数据增强技术&#xff0c;尝试使用EDA进行数据增强。 1.EDA简介 EDA是一种简单但是非常有效的文本数据增强方法&#xff0c;是由美国Protago实验室发表于 EMNLP-IJCNLP 2019 会议。EDA来自论文《EDA: Easy Data…

AI Chat 设计模式:12. 享元模式

本文是该系列的第十二篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 给我介绍一下享元模式A.1Q.2 也就是说&#xff0c;其实共享的是对象的内部状态&…

【Pytorch】P0 Windows 安装 Pytorch

Windows安装Pytorch 前言PyTorch&#xff0c;CUDA与GPUCUDA ToolkitSo...总而言之 整体流程一&#xff1a;安装 CUDA Toolkit步骤一&#xff1a;获取CUDA版本信息步骤二&#xff1a;下载安装 CUDA Toolkit步骤三&#xff1a;按照默认步骤安装步骤四&#xff1a;检查CUDA安装成功…

Android应用开发(6)TextView进阶用法

Android应用开发学习笔记——目录索引 上一章Android应用开发&#xff08;5&#xff09;文本视图&#xff08;TextView&#xff09;介绍了文本视图&#xff08;TextView&#xff09;设置文本内容、设置文本大小、设置文本显示颜色。 TextView是最基础的文本显示控件&#xff…

cpu的几核和几线程是什么意思

先说一下i7-12800H 14核 20线程是什么意思 答: 超线程功能先简单的解释下就是:能使一个大核拥有同时处理两个线程的能力. 14核是大小核技术,6个大核,8个小核,小核没有超线程功能 ,比大核的性能要弱些 也就是说6个大核,每个大核都同时处理2个线程, 每个小核只能同时处理…

Vue缓存字典值减少网络请求次数,解决同样参数并发请求多次

前言 在一些项目里&#xff0c;我们可能有着大量的下拉框&#xff0c;而这些下拉框的数据就来源于我们后端接口返回的字典信息。于是&#xff0c;画风可能是这样的&#xff0c;每次下拉&#xff0c;你都需要请求一次字典接口拿到这些数据&#xff0c;于是每次组件刷新都会重复…

UNIX基础知识:UNIX体系结构、登录、文件和目录、输入和输出、程序和进程、出错处理、用户标识、信号、时间值、系统调用和库函数

引言&#xff1a; 所有的操作系统都为运行在其上的程序提供服务&#xff0c;比如&#xff1a;执行新程序、打开文件、读写文件、分配存储区、获得系统当前时间等等 1. UNIX体系结构 从严格意义上来说&#xff0c;操作系统可被定义为一种软件&#xff0c;它控制计算机硬件资源&…