首先介绍一下我们的示例数据,此数据是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. php java memcached_php和java的memcached使用的兼容性问题解决过程
  2. 使用CXF开发WebService程序的总结(一):什么是webservice
  3. python访问数据库oracle_python连接oracle数据库
  4. 深度学习tensorflow框架的张量
  5. [Javascript] Avoid Creating floats if they are not needed
  6. 玩机器学习,能不知道它?
  7. 计算机专业开学要带电脑吗,大学上课要带电脑吗
  8. window.print 点击取消后再次打印无效_教程 | 图书馆自助复印打印机使用方法
  9. ajax优缺点及原理,Ajax实例解析,异步机制以及优缺点
  10. HIVE高级函数--get_json_object()和json_tuple()
  11. xp系统wep服务器,iis 6.0 完整安装包 适用xp
  12. 如何获得CSDN下载积分
  13. 政简网:还剩一个月时间怎么科学有效复习公务员考试?
  14. 最近游戏更新 未整理 无图片 续2
  15. 在DeSmuME模拟器上成功运行AK2i的内核,破解AK2i命令集
  16. 【尚硅谷|韩顺平】数据结构和算法
  17. 从零开发一款轻量级滑动验证码插件(深度复盘)
  18. java内省_java内省机制
  19. 通过百度地图把经纬度转化成城市名
  20. js向数组里添加元素

热门文章

  1. 移动端,录音之前判断是否已经获取录音权限
  2. 国外超级计算机园区,探秘全球最强超级计算机“神威 太湖之光”
  3. 零基础小白学Node-RED(07):综合案例分析
  4. vue localStorage.setItem
  5. VUE UI 组件 Element 中分页的使用
  6. 时光相册每天自动签到领空间 每日扩容50M
  7. 最简单的层次聚类算法及代码
  8. Java实现爬取京东手机数据
  9. 数据仓库的定义和特征
  10. 亚洲硅业IPO被终止:施正荣为实控人 签有上市对赌协议