浅谈LSTM对于周期时间序列数据的预测

注:本文章主要针对的是长周期的时间序列数据(10000-40000条为一个周期的数据)预测


产生训练和测试数据

我们需要做的是产生周期为20000条/周期的sin函数时间序列(用于训练)
以及周期为40000条/周期的sin函数时间序列(用于测试)
总数据长度都为200000条

import  numpy as np
import matplotlib.pyplot as plt

x=np.arange(0,20*np.pi,2*np.pi/20000,dtype='float64')
y=np.sin(x)
plt.plot(y)
plt.show()
np.save("./train.npy",y)

x=np.arange(0,10*np.pi,2*np.pi/40000,dtype='float64')
y=np.sin(x)
plt.plot(y)
plt.show()
np.save("./test.npy",y)

产生的数据如图:
训练:
在这里插入图片描述
测试:
在这里插入图片描述


进行实验

首先我们训练模型 采用前100步去预测后1步。
关于LSTM如何做时间序列预测的具体文章可以见简单粗暴LSTM:LSTM进行时间序列预测
我们对于训练数据进行6次迭代之后的loss为5.1398e-04
然后对于测试数据我们看一下预测的结果:
(蓝色底为实际值,黄色为预测值,重合部分被覆盖)

import  numpy as np
import matplotlib.pyplot as plt

testY = np.load("./testY"+".npy")
y_hat = np.load("./y_hat"+".npy")
plt.plot(testY)
plt.plot(y_hat)
plt.show()

在这里插入图片描述
可以看到测试数据与预测数据很贴近,也就是说对于周期为20000的数据来说,使用前100步预测后1步并不能很好地记录周期信息。
我们交换一下,用测试数据去训练模型,用新模型去预原来的train数据,得到的结果如下:
在这里插入图片描述
依旧无法记录周期信息


实验2

本次我们采用200序列为一周期的数据去训练(模拟对于长周期数据的采样):
在这里插入图片描述
训练完成后,预测结果为:
在这里插入图片描述
将训练数据改为100/周期结果为:
在这里插入图片描述
改为50/周期 结果为:
在这里插入图片描述
可以看到LSTM对于周期数据的周期记忆并不是很好,但是如果能将周期控制在预测步数(本次为100步)之内,其高低差可以对异常检测提供思路。

采用100/周期的数据训练,200/周期的数据进行预测,结果为:
在这里插入图片描述
放大:
在这里插入图片描述
可以看到,如果把周期控制在n_prediction(预测步数之内),当测试数据周期发生改变的时候,对于周期变化的响应体现在高低值的变化上,可以为异常检测提供思路


实验3

本次实验我们采用前100步去预测后100步,具体更改的是LSTM中对于数据进行整理的那一步:

#look_back设为100
def create_dataset(dataset, look_back):
    '''
    对数据进行处理
    '''
    dataX, dataY = [], []
    for i in range(len(dataset)-2*look_back-1):
        a = dataset[i:(i+look_back),:]
        dataX.append(a)
        dataY.append(dataset[(i+look_back):(i+2*look_back),:])
    TrainX = np.array(dataX)
    Train_Y = np.array(dataY)
    Train_Y = Train_Y.reshape(Train_Y.shape[0],Train_Y.shape[1])
    return TrainX, Train_Y

同样的 使用20000/周期的数据进行训练,结果为:

testY = np.load("./testY"+".npy")
y_hat = np.load("./y_hat"+".npy")
y_hat_one = []
y_test_one = []
#对于后100步的预测取后1步
for i in range(len(y_hat)):
    y_hat_one.append(y_hat[i,0])
    y_test_one.append(testY[i,0])
plt.plot(y_test_one)
plt.plot(y_hat_one)
plt.show()

在这里插入图片描述
得到了与实验1类似的结果

  • 13
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
基于深度学习的时序数据异常检测预测模型通常使用循环神经网络(RNN)或卷积神经网络(CNN)等模型进行建模。 其中,RNN模型是一种经典的序列建模方法,可以很好地处理时间序列数据。在RNN模型中,每个时间步的输入都是当前的观测值和前面的历史观测值,通过对历史数据进行记忆和学习,可以预测当前时刻的观测值。在时序数据异常检测中,可以使用LSTM或GRU等RNN模型进行建模,通过对时间序列数据进行预测并计算预测误差来检测异常。具体地,可以将时序数据分为训练集和测试集,训练集用于训练模型,测试集用于检测异常。在训练阶段,可以使用历史数据作为输入,训练模型的参数,使得模型能够准确地预测下一个时间步的观测值。在测试阶段,对于每个时间步,可以使用模型预测当前时刻的观测值,并计算预测误差,如果误差超过了阈值,则判定为异常。 另外,CNN模型也可以用于时序数据异常检测的预测模型中。CNN模型可以有效地提取时间序列数据中的特征,尤其是对于一些周期性的时间序列数据,如股票数据、气象数据等,CNN模型可以很好地提取周期性的特征。在时序数据异常检测中,可以使用CNN模型对时间序列数据进行建模,并使用滑动窗口的方式对时间序列数据进行分割,以便进行预测和异常检测。 总的来说,基于深度学习的时序数据异常检测预测模型可以很好地处理时间序列数据,并且具有较高的准确率和鲁棒性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值