深度学习之LSTM时间序列预测_lstm时间序列预测模型-程序员宅基地

技术标签: Tensorflow  python  lstm  tensorflow  深度学习  deeplearning  

LSTM(long short-term memory,LSTM):长短时记忆网络,是循环神经网络(recurrent neural network,RNN)的一个重要结构,循环神经的主要用途是处理和预测序列数据。全连接神经网络(感知机,BP神经网络,RBF 神经网络等)或卷积神经网络模型中,网络结构都是从输入层到隐含层再到输出层,层与层之间是全连接或部分连接,每层节点之间是无连接的。然而循环神经网络为了刻画一个序列的当前的输出信息和之前信息的关系。从结构上说,循环神经网络会记忆之前的信息,并利用之前记忆的信息影响后面节点的输出循环神经网络的隐藏层之间的节点是有连接的,隐藏层的输入不仅包括输入层的输出,还包括上一时刻隐藏层的输出。 

网络的具体结构以及意义,参考下文

https://www.jianshu.com/p/9dc9f41f0b29


下面是我的数据预测:

# -*- coding: utf-8 -*-
"""
 LSTM prediction
@author: ljq

"""
#导入库函数
import numpy 
import matplotlib.pyplot as plt
from pandas import read_csv
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
#读取数据
data= read_csv('data_s.csv') #csv文件 n*1 ,n代表样本数,反应时间序列,1维数据
values1 = data.values;
dataset=values1[:,0].reshape(-1,1)#注意将一维数组,转化为2维数组
dataset = dataset.astype('float32')#将数据转化为32位浮点型,防止0数据 
                  
# convert an array of values into a dataset matrix
def create_dataset(dataset, look_back=1):#后一个数据和前look_back个数据有关系
    dataX, dataY = [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), 0]
        dataX.append(a) #.apeend方法追加元素
        dataY.append(dataset[i + look_back, 0])
    return numpy.array(dataX), numpy.array(dataY) #生成输入数据和输出数据 

numpy.random.seed(7)#随机数生成时算法所用开始的整数值


# normalize the dataset
scaler = MinMaxScaler(feature_range=(0, 1))#归一化0-1
dataset = scaler.fit_transform(dataset)
# split into train and test sets  #训练集和测试集分割
train_size = int(len(dataset) * 0.67)#%67的训练集,剩下测试集
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]#训练集和测试集

# use this function to prepare the train and test datasets for modeling
look_back = 1
trainX , trainY = create_dataset(train, look_back)#训练输入输出
testX,testY=create_dataset(test, look_back)#测试输入输出


 #reshape input to be [samples, time steps, features]#注意转化数据维数
trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1]))

#建立LSTM模型
model = Sequential()
model.add(LSTM(11, input_shape=(1, look_back)))#隐层11个神经元 (可以断调整此参数提高预测精度)
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')#评价函数mse,优化器adam
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2)#100次迭代 
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
#数据反归一化
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])

trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))


trainPredictPlot = numpy.empty_like(dataset)
trainPredictPlot[:, :] = numpy.nan
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict

# shift test predictions for plotting
testPredictPlot = numpy.empty_like(dataset)
testPredictPlot[:, :] = numpy.nan
testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict

# plot baseline and predictions

plt.figure(figsize=(20,6))
l1,=plt.plot(scaler.inverse_transform(dataset),color='red',linewidth=5,linestyle='--')
l2,=plt.plot(trainPredictPlot,color='k',linewidth=4.5)
l3,=plt.plot(testPredictPlot,color='g',linewidth=4.5)
plt.ylabel('Height m')
plt.legend([l1,l2,l3],('raw-data','true-values','pre-values'),loc='best')
plt.title('LSTM Gait Prediction')
plt.show()

以下是实验结果:

下面介绍程序中的一些用法及注释:

Pandas数据导入:可参考官方文档 :

https://pandas.pydata.org/pandas-docs/stable/api.html#input-output

#举一个简单的例子 用一下pandas读数据

import pandas as pd
 #Read data
data = pd.read_excel(r'C:\Users\1042zyl\Desktop\pptdata.xlsx',sheet_name=3,index_col = None)
#Normalization 规范化量程在0-1
data = (data - data.min()) / (data.max() - data.min())
#Export excel
data.to_excel('1.xlsx')

batch_size 大小选择:太小,算法难以收敛;适当增大,收敛快,精度上升;过大,时间最优但是陷入局部最优。且越大对内存要求也在增加。

numpy中的: 对象.shape():读取对象的维度。对象.shape(0)读取行数对象.shape(1)读取列数,。注意list(列表)是没有shape属性的,需要把它转化为    np.shape(x)或者np.arrray(x).shape.  扩展:numpy 中转置:np.transpose(x)或者np.arrray(x).T

注意这里的np.array(x)只是将数据化成numpy要求,维度并没有变化。

numpy 中的reshape用法参考官网

https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

对其中的一句做解释,One shape dimension can be -1. In this case, the value is inferred from the length of the array and remaining dimensions.-1代表不确定数,当行数不确定[-1,1];当列数不确定[1,-1]

注意设置.reshape(数据,newspace=(行数,k个1,列数)) 可以实现增加维数。









版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Melo0705/article/details/80913396

智能推荐

手把手教你用Python批量实现文件夹下所有Excel文件的第二张表合并-程序员宅基地

文章浏览阅读1.6k次。点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤怀君属秋夜,散步咏凉天。大家好,我是Python进阶者。今天继续给..._利用python,实现excel三张表的第二张表数据操作

[完]机器学习实战 第三章 决策树(Decision Tree)_moudle对象的决策树-程序员宅基地

文章浏览阅读1.7k次。本章介绍了什么是决策树,如何构建决策树,构建决策树时选择哪个特征划分数据,根据什么(香农熵)划分数据。介绍了信息论里的基本概念:熵、信息增益。用字典存储决策树,程序实现了决策树。并且介绍了如何使用matplotlib如何图形化显示决策树。_moudle对象的决策树

【java基础】理解面向对象OOP-程序员宅基地

文章浏览阅读271次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、面向过程与面向对象二、类与对象总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入前言Java是一门面向

ctags快捷键_ctags 快捷键-程序员宅基地

文章浏览阅读4k次。ctags快捷键 2011-10-24 11:13:01| 分类:Linux |字号 订阅ctags浏览代码 (有的命令说明可能不准确):set tags=/Dir/tags 设置需要的tags文件,可以多个:set tags=/dir1/tags, /dir2/tags:tag xxx 转到满足查找代码的定义处,简写为 :ta xxx:_ctags 快捷键

python数据分析与可视化-程序员宅基地

文章浏览阅读2.4w次,点赞32次,收藏369次。数据分析初始阶段,通常都要进行可视化处理。数据可视化旨在直观展示信息的分析结果和构思,令某些抽象数据具象化,这些抽象数据包括数据测量单位的性质或数量。本章用的程序库matplotlib是建立在Numpy之上的一个Python图库,它提供了一个面向对象的API和一个过程式类的MATLAB API,他们可以并行使用。1、import numpy as npimport matplotlib.pyplot as pltscores=np.random.randint(0,100,50)plt.hist_python数据分析与可视化

nginx配置http自动转发https-程序员宅基地

文章浏览阅读2.1k次。打开nginx配置文件,找到如下位置,修改即可server { listen 80 default_server; listen [::]:80 default_server; server_name your domain;//这里填写你的域名 root /var/www/html;

随便推点

本质矩阵,基础矩阵,自由度及其解法_为什么尺度等价性会降低自由度-程序员宅基地

文章浏览阅读1.1k次。一:为什么本质矩阵的秩为2?二:为什么基础矩阵的秩为2?三:为什么尺度等价性要减少一个自由度?四:为什么基础矩阵自由度是7?五:为什么本质矩阵自由度是5?六:为什么单应矩阵自由度是8?七:计算基础矩阵(1) 基于代数误差的线性估计(8点法和7点法,6点法)(2) 基于几何误差的非线性估计 (点到对应极线距离的平方和作为误差,重投影误差)八:计算本质矩阵(8点法和5点法)九:计算单应矩阵十:从本质矩阵恢复相机运动R,t(4种可能)十一:从单应矩阵恢复相机运动R,t(8种可能)SLAM_为什么尺度等价性会降低自由度

再见,汉堡菜单,我们有了新的 Android 交互设计方案-程序员宅基地

文章浏览阅读314次。本文讲的是再见,汉堡菜单,我们有了新的 Android 交互设计方案,我清楚地记得 3 月 15日当那条新闻传来的时候我正在干什么——当我们正深陷于将我们Android 职位搜索应用中的汉堡菜单抛弃,转而使用一种可见的标签式导航时,谷歌宣布将底部导航栏添加到 Android Material Design 的指导手册中,这个新闻快速传遍了 An..._移动端汉堡菜单交互

我的网易博客-程序员宅基地

文章浏览阅读48次。http://huanglianjing0.blog.163.com/转载于:https://www.cnblogs.com/huanglianjing/p/3963619.html

vim 设置自动填充tab制表符_ubuntuvim编辑器如何设置table键为制表符-程序员宅基地

文章浏览阅读1.9k次。如果用的是Linux或MAC系统,在用户主目录下创建一个名为.vimrc的文件;如果是windows操作系统,则应该命名为_vimrc。将其保存在vim的安装文件夹下,同时添加一个名为vim的环境变量(其值就是该路径),这样vim就能够知道从那里获取它。vimrc文件内容如下:set encoding=utf-8set pasteset expandtabset textwidth=0set_ubuntuvim编辑器如何设置table键为制表符

联播大业王恒:国债期货上市后的三种股票有望成为流行品种_为什么国债期货只有三个品种-程序员宅基地

文章浏览阅读467次。经国务院批准,中国证监会的批准,去年国债期货在九月六日,正式在中国金融期货交易所上市。自1995年代以来国债期货交易暂停,徘徊后,等待18年,国债期货将再次回到大阶段的中国资本市场。国债期货作为一种重要的利率期货品种,对我国大大加快利率市场化的介绍后,三只个股有望受益的政府债券期货,成为一个“热”的主题:第一个是股权期货公司上市公司。其次,证券公司,期货业务的利润贡献度_为什么国债期货只有三个品种

npm install --save-dev 和 --save的区别-程序员宅基地

文章浏览阅读116次。npm install --save-dev 和 --save的区别1. 阅前须知:package.json 文件中两种包的选择2. 区别说明:1. 阅前须知:package.json 文件中两种包的选择package.json文件中:Valuedependencies属性中:生产环境中所需要的包devDepedencies属性中:开发和测试中需要的包2. 区别说明:命令:作用说明–save依赖包名称添加到 package.json 文件 de