首先介绍一下我们的示例数据,此数据是1949 到 1960 一共 12 年,每年 12 个月的航班乘客数据,一共 144 个数据,单位是 1000。
下载地址
或者:百度云链接:https://pan.baidu.com/s/1jIAVEVkcpD2o3pUOfstthQ
提取码:1qn2
数据如图所示

我们选取前60%作为训练数据,后40%作为测试数据

#头文件
import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
import  pandas as pd
import  os
from keras.models import Sequential, load_model#加载数据
alldata = pd.read_csv("./international-airline-passengers.csv")
#只取数值列
alldata = alldata.iloc[:,1]
alldata = np.array(alldata,dtype='float64')
traindata = alldata[:int(len(alldata)*0.6)]
testdata = alldata[int(len(alldata)*0.6):]

LSTM进行预测的时候要对于数据进行转换,具体可以见我之前的博客
简单粗暴LSTM:LSTM进行时间序列预测
实验中所用到的函数

#转换函数
def Create_dataset(dataset,look_back):data_X, data_Y = [], []for i in range(len(dataset) - look_back - 1):a = dataset[i:(i + look_back)]data_X.append(a)data_Y.append(dataset[i + look_back])data_X = np.array(data_X)data_Y = np.array(data_Y)return  data_X,data_Y#单维最大最小归一化和反归一化函数
def Normalize(list):list = np.array(list)low, high = np.percentile(list, [0, 100])delta = high - lowif delta != 0:for i in range(0, len(list)):list[i] = (list[i]-low)/deltareturn  list,low,highdef FNoramlize(list,low,high):delta = high - lowif delta != 0:for i in range(0, len(list)):list[i] = list[i]*delta + lowreturn list#LSTM进行训练的函数
def Train_Model(train_X,train_Y):model = Sequential()model.add(LSTM(4, input_shape=(train_X.shape[1],train_X.shape[2])))#Dense层的1是预测维度为1model.add(Dense(1))model.compile(loss='mean_squared_error', optimizer='adam')model.fit(train_X, train_Y, epochs=1000, batch_size=1, verbose=2)# model.save(os.path.join("DATA","LSTMBLog" + ".h5"))return model

进行预测实验

实验分为三种情况:
1.对于训练数据和测试数据分别进行归一化
2.对于训练数据进行归一化之后。使用训练数据的最大最小值(训练数据的范围)对于测试数据进行归一化
3.对于训练和测试的整体数据统一进行归一化

1.对于训练数据和测试数据分别进行归一化

#实验1
train_n,train_low,train_high = Normalize(traindata)
test_n,test_low,test_high = Normalize(testdata)
print(train_n,test_n)
#前一个值预测后一个值
train_X,train_Y = Create_dataset(train_n,look_back=1)
test_X,test_Y = Create_dataset(test_n,look_back=1)
#额外添加一个维度使train_X,test_X变为三维
train_X = np.reshape(train_X, (train_X.shape[0], train_X.shape[1], 1))
test_X = np.reshape(test_X, (test_X.shape[0], test_X.shape[1], 1))model = Train_Model(train_X,train_Y)train_predict = model.predict(train_X)
test_predict  = model.predict(test_X)#反归一化
train_Y = FNoramlize(train_Y,train_low,train_high)
train_predict = FNoramlize(train_predict,train_low,train_high)
test_Y = FNoramlize(test_Y,test_low,test_high)
test_predict = FNoramlize(test_predict,test_low,test_high)#进行绘图
plt.subplot(121)
plt.plot(train_Y)
plt.plot(train_predict)
plt.subplot(122)
plt.plot(test_Y)
plt.plot(test_predict)
plt.show()

结果如图所示:可以看到LSTM对于训练数据和预测数据都能很好的拟合

2.对于训练数据进行归一化之后。使用训练数据的最大最小值(训练数据的范围)对于测试数据进行归一化

引入新的归一化函数

def Normalize2(list,low,high):list = np.array(list)delta = high - lowif delta != 0:for i in range(0, len(list)):list[i] = (list[i]-low)/deltareturn  list

进行实验

#实验2
train_n,train_low,train_high = Normalize(traindata)
#更新的归一化
test_n = Normalize2(testdata,train_low,train_high)
print(train_n,test_n)
#前一个值预测后一个值
train_X,train_Y = Create_dataset(train_n,look_back=1)
test_X,test_Y = Create_dataset(test_n,look_back=1)
#额外添加一个维度使train_X,test_X变为三维
train_X = np.reshape(train_X, (train_X.shape[0], train_X.shape[1], 1))
test_X = np.reshape(test_X, (test_X.shape[0], test_X.shape[1], 1))model = Train_Model(train_X,train_Y)train_predict = model.predict(train_X)
test_predict  = model.predict(test_X)#反归一化
train_Y = FNoramlize(train_Y,train_low,train_high)
train_predict = FNoramlize(train_predict,train_low,train_high)
test_Y = FNoramlize(test_Y,train_low,train_high)
test_predict = FNoramlize(test_predict,train_low,train_high)#进行绘图
plt.subplot(121)
plt.plot(train_Y)
plt.plot(train_predict)
plt.subplot(122)
plt.plot(test_Y)
plt.plot(test_predict)
plt.show()

这时预测结果如图

可以看到对于test数据预测结果发生了变化,周期没有改变,但是值发生了改变

3.对于训练和测试的整体数据统一进行归一化

#实验3
alldata_n,all_low,all_high = Normalize(alldata)
#也可以直接对alldata进行截取
train_n = Normalize2(traindata,all_low,all_high)
test_n = Normalize2(testdata,all_low,all_high)
print(train_n,test_n)#前一个值预测后一个值
train_X,train_Y = Create_dataset(train_n,look_back=1)
test_X,test_Y = Create_dataset(test_n,look_back=1)
#额外添加一个维度使train_X,test_X变为三维
train_X = np.reshape(train_X, (train_X.shape[0], train_X.shape[1], 1))
test_X = np.reshape(test_X, (test_X.shape[0], test_X.shape[1], 1))model = Train_Model(train_X,train_Y)train_predict = model.predict(train_X)
test_predict  = model.predict(test_X)#反归一化
train_Y = FNoramlize(train_Y,all_low,all_high)
train_predict = FNoramlize(train_predict,all_low,all_high)
test_Y = FNoramlize(test_Y,all_low,all_high)
test_predict = FNoramlize(test_predict,all_low,all_high)#进行绘图
plt.subplot(121)
plt.plot(train_Y)
plt.plot(train_predict)
plt.subplot(122)
plt.plot(test_Y)
plt.plot(test_predict)
plt.show()

预测结果:


结论

可以看到LSTM进行预测的时候会保留趋势(周期)信息以及训练数据的高低(范围)信息。
其中
1.对于训练数据和测试数据分别进行归一化 保留周期信息
2.对于训练数据进行归一化之后。使用训练数据的最大最小值(训练数据的范围)对于测试数据进行归一化 保留周期和范围信息
3.对于训练和测试的整体数据统一进行归一化 保留周期和范围信息

在进行LSTM预测的时候,我们可以通过对于归一化的选择来进行是否进行高低信息的使用。

注:代码已上传到我的github,同时附录了单维多维归一化函数
本次实验中2.3.的预测结果也有一些区别,实验中3.的test预测结果更高一些

#这两种方式会产生不同的结果
normalize = np.arange(10,dtype='float64')
normalize = np.arange(10)
normalize.dtype = 'float64'

浅谈归一化对于LSTM进行时间序列预测的影响(附归一化代码)相关推荐

  1. 基于Keras的LSTM多变量时间序列预测(北京PM2.5数据集pollution.csv)

                                 基于Keras的LSTM多变量时间序列预测 传统的线性模型难以解决多变量或多输入问题,而神经网络如LSTM则擅长于处理多个变量的问题,该特性使 ...

  2. python短期预测图_Python中利用长短期记忆模型LSTM进行时间序列预测分析

    原文链接:http://tecdat.cn/?p=6663 此示例中,神经网络用于使用2011年4月至2013年2月期间的数据预测都柏林市议会公民办公室的能源消耗. 每日数据是通过总计每天提供的15分 ...

  3. 组合预测 | MATLAB实现EMD-KPCA-LSTM、EMD-LSTM、LSTM多变量时间序列预测对比

    组合预测 | MATLAB实现EMD-KPCA-LSTM.EMD-LSTM.LSTM多变量时间序列预测对比 目录 组合预测 | MATLAB实现EMD-KPCA-LSTM.EMD-LSTM.LSTM多 ...

  4. 股票价格预测 | Python实现LSTM股票价格时间序列预测

    股票价格预测 | Python实现LSTM股票价格时间序列预测 目录 股票价格预测 | Python实现LSTM股票价格时间序列预测 基本介绍 数据集 程序下载 总结 基本介绍 长短时记忆(LSTM) ...

  5. 基于爬行动物搜索RSA优化LSTM的时间序列预测

    0 引言 基于LSTM进行时间序列预测方法简单有效.LSTM的出现为时间序列预测提供了一个新的研究方向.然而,与大部分网络模型一样,LSTM效果受其超参数设置的影响.为此,本文采用爬行动物搜索Rept ...

  6. TensorFlow搭建LSTM实现时间序列预测(负荷预测)

    目录 I. 前言 II. 数据处理 III. 模型 IV. 训练/测试 V. 源码及数据 I. 前言 前面已经写过不少时间序列预测的文章: 深入理解PyTorch中LSTM的输入和输出(从input输 ...

  7. TensorFlow搭建双向LSTM实现时间序列预测(负荷预测)

    目录 I. 前言 II. 原理 III. 模型定义 IV. 训练和预测 V. 源码及数据 I. 前言 前面几篇文章中介绍的都是单向LSTM,这篇文章讲一下双向LSTM. 系列文章: 深入理解PyTor ...

  8. 独家 | 教你使用简单神经网络和LSTM进行时间序列预测(附代码)

    翻译:张玲 校对:丁楠雅 本文约1500字,建议阅读5分钟. 作者基于波动性标准普尔500数据集和Keras深度学习网络框架,利用python代码演示RNN和LSTM RNN的构建过程,便于你快速搭建 ...

  9. 基于Keras的LSTM多变量时间序列预测

    LSTM是一种时间递归神经网络,它出现的原因是为了解决RNN的一个致命的缺陷.原生的RNN会遇到一个很大的问题,叫做The vanishing gradient problem for RNNs,也就 ...

最新文章

  1. Spring testcontext
  2. 2016年十大存储预测
  3. Ryu oslo学习总结
  4. 20151118小问题
  5. leetcode32 --- longestValidParentheses
  6. 向Docker容器中导入sql文件
  7. 大型网站技术架构(八)--网站的安全架构(转)
  8. 程序bug导致了天大的损失,要枪毙程序猿吗?
  9. mysql 数据库视图_MySQL视图介绍
  10. laravel leftjoin 右侧取最新一条_高铁规划:湖南至广西将增添一条高铁,填补中西部地区铁路网空白...
  11. json处理第一篇:利用Jackson处理json
  12. JBoss安装与配置
  13. 读SUCH AMERCAN和贾平凹的画集
  14. 【语音去噪】基于matlab低通+自适应滤波去噪【含Matlab源码 352期】
  15. 三线表里加小短线_快速搞定学术论文中的三线表
  16. 网吧十大漏洞曝光(转)
  17. 物流app开发需要多少钱
  18. 签租房电子合同必须留意什么地方?
  19. 国内首家中高端自由职业者共享平台——易分之一,即将上线运营
  20. 服务器七雄争霸官方网站,七雄争霸特效城堡半价购买 全新服务器等您来挑战...

热门文章

  1. 10.29关于数字大爆炸游戏规则的重新理解以及重打
  2. 对于spring boot的理解
  3. 少样本苹果分类机器深度学习
  4. CPU的发展历史和工作原理
  5. 巨蟹座|巨蟹座性格分析
  6. 跨境电商维护商标的重要性和有效途径——成都扬帆志远教育公司
  7. 使用 Electron 将应用程序放入托盘
  8. 电子烟包装设计对于企业来说有什么重要性?
  9. Python告诉你《少年的你》为何刷爆票房?
  10. 【Ubuntu 20.04 LTS】界面自定义及美化