Python实现多变量序列堆叠式LSTM模型,并实现未来多时刻预测

news/2025/2/13 0:08:29/

       在时间序列相关的很多建模工作中,LSTM模型是经常会使用到的,从提出到现在LSTM模型已经有了很多的扩展、变种和应用,今天我们简单地实现基于LSTM模型来对多个变量的数据进行建模预测,在简单地预测中只能做单步预测,这里实现了多步的预测分析。

       具体实现如下:

#!usr/bin/env python
#encoding:utf-8
from __future__ import division'''
__Author__:沂水寒城
功能: 基于堆叠式LSTM神经网络的多变量序列预测模型
'''import os
import json
import sys
import math
import time
import keras
import random
import pymysql
import datetime
import platform
import numpy as np
import pandas as pd
from keras.utils import plot_model
from  keras.layers.pooling import MaxPooling1D
from keras.layers import LSTM,Dense,Input,add,Flatten
import matplotlib.pyplot as plt
from keras.models import Sequential,Model
from sklearn.preprocessing import MinMaxScaler,LabelBinarizer,LabelEncoder,Imputer
from keras.layers.core import Activation,Dropout,Dense,Flatten
from sklearn.model_selection import train_test_split
from scipy.stats import pearsonr,spearmanr,kendalltau 
from keras.callbacks import EarlyStopping,ModelCheckpoint,Callback
from keras.layers.normalization import  BatchNormalization  
from keras.optimizers import SGD, Adadelta, Adagrad,RMSprop  
from keras.layers.advanced_activations import PReLU  
from utils import predictFuture
from sklearn.metrics import explained_variance_score, mean_absolute_error, mean_squared_error, r2_score
from keras.layers.convolutional import Conv1D,ZeroPadding1D,Conv2D,MaxPooling2D,AveragePooling2D,Convolution2D,ZeroPadding2D
from keras.layers import Dense, Dropout, Embedding, LSTM, Bidirectional
from keras.layers import TimeDistributeddef sliceWindow(data,step):'''移动滑窗创建数据集'''X,y=[],[]for i in range(0,len(data)-step,1):end=i+steponeX,oney=data[i:end,:],data[end, :]X.append(oneX)y.append(oney)return np.array(X),np.array(y)def dataSplit(dataset,step):'''数据集分割'''datasetX,datasetY=sliceWindow(dataset,step)train_size=int(len(datasetX)*0.70)X_train,y_train=datasetX[0:train_size,:],datasetY[0:train_size,:]X_test,y_test=datasetX[train_size:len(datasetX),:],datasetY[train_size:len(datasetX),:]X_train=X_train.reshape(X_train.shape[0],step,-1)X_test=X_test.reshape(X_test.shape[0],step,-1)print('X_train.shape: ',X_train.shape)print('X_test.shape: ',X_test.shape)print('y_train.shape: ',y_train.shape)print('y_test.shape: ',y_test.shape)return X_train,X_test,y_train,y_testdef seq2seqModel(X,step):'''序列到序列堆叠式LSTM模型'''model=Sequential()model.add(LSTM(256, activation='relu', return_sequences=True,input_shape=(step,X.shape[2])))model.add(LSTM(256, activation='relu'))model.add(Dense(X.shape[2]))model.compile(optimizer='adam', loss='mse')return modelif __name__=='__main__':#数据集加载with open('dataset.txt') as f:data_list=[one.strip().split(',') for one in f.readlines()[1:] if one]dataset=[]for i in range(len(data_list)):dataset.append([float(O) for O in data_list[i][1:]])dataset=np.array(dataset)step=7X_train,X_test,y_train,y_test=dataSplit(dataset,step)model=seq2seqModel(X_train,step)model.fit(X_train,y_train,epochs=50,verbose=0)# test=[#       [30.0,58.0,7.0,24.0,0.9,83.0,103.0],#       [43.0,72.0,6.0,23.0,1.1,85.0,103.0],#       [66.0,105.0,6.0,22.0,1.3,134.0,103.0],#       [54.0,94.0,7.0,27.0,1.1,125.0,103.0],#       [64.0,90.0,6.0,19.0,1.2,127.0,103.0],#       [59.0,92.0,6.0,20.0,1.1,126.0,103.0],#       [61.5,91.0,6.0,19.5,1.15,134.0,103.0]#      ]# #真实值   [38.0,66.0,5.0,17.0,1.2,138.0,103.0]# test=np.array(test)# test=test.reshape((1,step,7))# y_pre=model.predict(test,verbose=0)# print('y_pre: ',y_pre)future=predictFuture(model,dataset,7,step,60)for one in future:print('one: ',one)dataset=[]for i in range(len(data_list)):dataset.append([float(O) for O in data_list[i][1:]])D1=[one[0] for one in dataset]D2=[one[0] for one in future]plt.plot(list(range(len(D1))),D1,label='F1 True')plt.plot(list(range(len(D1),len(D1)+len(D2))),D2,label='F1 Future Predict')plt.legend()plt.title('Data True and Predict Cruve')plt.savefig('demo.png')

         我们在代码中提供了单个样本的测试样例,如下所示:

       预测结果如下:

       接下来我们基于滚动预测对未来60个时刻的数据进行了预测分析,部分输出截图如下:

     为了对比分析,我们绘制了原始数据曲线和预测的数据曲线,如下图所示:

      学习记录了!

 

 

 


http://www.ppmy.cn/news/392382.html

相关文章

七夕专属博文-使用QGraphics画“红心“或“黑心“(含数学模型讲解)

说明 实现的效果是这样的,使用QGraphicsEllipseItem和QGraphicsPolygonItem画“心”。 比如来个红心 再来个“黑心”: “心形”模型详解 这里需要用到高中数学。 ①要了解圆的参数方程,其公式是这样的: x a r cosθ 和 y …

ecstore ego.php,商派(ONex)的bbc多用户商城bbc问题解答总集ecstore

1.bbc的前台用户登录失效时间是多少 前台系统默认设置的是3600秒,如果设置为记住密码则是7天 2.oms运行时报错 今天运行oms时出现错误,请问可能会是什么原因导致? TrackThu, 18 Feb 16 11:25:07 0800 t function does not exist in /data/gua…

商派oneX新零售系统上架华为云云商店,首次参与“828企业节”

01 商派oneX平台上架「华为云」云商店* 华为联运模式开启数字化转型新篇章* 由华为云与生态伙伴联合发起的首届828 B2B企业节将于8月28日正式启动。828 B2B企业节是中国首个基于数字赋能的“B2B企业节”,旨在助力中国企业通过数字化转型实现创新发展,…

商派onex本地部署无法进入的问题

商派最新版的ONex本地虚拟机部署项目无法进入注册的问题解决 进入项目的database.php文件,复制host的值 vim /etc/hosts,将hosts内容添加到/etc/hosts里面去就可以了 转载于:https://www.cnblogs.com/wangning528/p/7904314.html

如何查找自己笔记本的产品密钥

1.首先在键盘按下WinR打开运行 2.输入regedit,回车之后会打开注册表 3.依次展开到 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform目录下,单击SoftwareProtectionPlatform 4.双击右侧的BackupProd…

windows server 2003 R2密钥

windows server 2003 R2 密钥 windows server 2003 R2 32位密钥 序列号: MDGIK PF6YO PD8D ROW-TIKNE Windows Server 2003 R2 64位密钥 序列号: RYCR6-T7Y6M-2TVHK C2YW3-7TYQ8 W

通过CMD命令查找产品密钥

1.winr,输入cmd。 2.输入wmic path softwarelicensingservice get OA3xOriginalProductKey

如何查看电脑的产品密钥

如何查看电脑的产品密钥 密钥有使用次数,换了新的电脑之后,电脑本身的windows是已激活状态,那么怎么查看电脑的密钥呢? 1. 在键盘按下WinR打开运行。 2. 输入regedit,回车会打开注册表。 3. 输入绝对路径&#xff1…