归一化与反归一化在Bi-LSTM多特征时序预测中应用(附实操代码)

2023-11-19

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录


前言

双向长短时记忆(Bi-LSTM)模型是一种常用于时间序列预测的RNN算法。本文专门针对多特征时间序列预测中归一化与反归一化问题进行讨论,旨在为新手提供一个相对详细实用的解决方案。但由于本人知识有限,如果有误,欢迎大家指正!


一、 Bi-LSTM 是什么?

为了能利用先前的信息,普通神经网络通过引入循环形成循环神经网络(RNN)。为了更好地利用先前的信息,循环神经网络利用输入门、遗忘门、输出门进行改进,保留历史数据的同时,对输入数据进行“遗忘了旧的信息,并添加了新的信息”操作,二者的存在构成了长短时记忆网络(LSTM)。而为了同时利用之后数据的信息,可输入的序列反转,重新按照LSTM的方式计算一遍输出,并将二者简单堆叠,就构成了双向长短时记忆网络(Bi-LSTM)

二、为什么要归一化和反归一化?

测试集的归一化的均值和标准偏差应该来源于训练集。

1.归一化的好处:

(1)不同特征量纲不同,可以通过归一化消除量纲的影响

(2)可以加快模型处理数据的速度

2.反归一化的好处:

通过对预测结果的反归一化,使最终结果更加直观

三、归一化和反归一化使用的公式

1.归一化

2.反归一化

四、实操代码

1.导入相关库

代码如下:

import numpy as np
from sklearn.preprocessing import MinMaxScaler
import keras
from tensorflow.keras.callbacks import EarlyStopping
from gc import callbacks

2.构建样本集

这里采用创造随机数据的方式,构造了样本集,并划分训练集和测试集

代码如下:

#构建样本集
n = 1000
input_dim = 5
time_steps = 10
data0 = np.random.rand(n, input_dim+1)*3
data = []
#基于时间步time_steps创建样本
for i in range(0, data0.shape[0]-time_steps):  
    data_i = data0[i:i+time_steps, :] 
    data.append(data_i)
data = np.array(data)

#划分训练集和测试集
ratio = 0.65
k = int(ratio*data.shape[0])
train = data[:k]
test = data[k:]

3.数据归一化

适用于Bi-LSTM(LSTM)的多特征数据由于时间步的存在而增加了一个维度,所以归一化的方式应该做出相应的改变。主要思路是:由训练集所对应的未经时间步扩充的数据作为标准,对其他数据进行归一化。

#进行归一化
scaler = MinMaxScaler(feature_range=(0, 1))
#由于建立时滞会去除time_steps个数据,所以要加上
scaler = scaler.fit(data0[:k+time_steps])#将训练集对应的原始数据作为标准
train_norm = np.zeros((train.shape[0], train.shape[1], train.shape[2]))
test_norm = np.zeros((test.shape[0], test.shape[1], test.shape[2]))
for time in range(time_steps):
    train_norm[:, time, :] = scaler.transform(train[:, time, :])
    test_norm[:, time, :] = scaler.transform(test[:, time, :])

4.训练模型并进行预测

#划分XY
X_train = train_norm[:, :, :-1]
X_test = test_norm[:, :, :-1]
Y_train = train_norm[:, -1, -1]  # 实际上Y部分不需要时序扩充
Y_test = test_norm[:, -1, -1]

#建立bilstm模型
modell = keras.Sequential()
modell.add(keras.layers.Bidirectional(
    keras.layers.LSTM(units=128, batch_input_shape=(n, time_steps, input_dim))))  # relu
modell.add(keras.layers.Dense(1))
modell.compile(loss='mean_squared_error', optimizer='adam')

#训练模型
monitor = EarlyStopping(monitor='loss', patience=30)
history = modell.fit(X_train, Y_train, callbacks=[monitor], epochs=10)

#预测
predict = modell.predict(X_test)

5.预测结果的反归一化

对于预测的结果,往往可以使用反归一化,使最终结果更加直观

该处使用的url网络请求的数据。

#反归一化
max_standard = scaler.data_max_[-1]
min_standard = scaler.data_min_[-1]

real_predict = predict*(max_standard-min_standard)+min_standard
real_y=Y_test*(max_standard-min_standard)+min_standard

总结

以上就是本文的全部内容,本文详细叙述了针对多维输入的Bi-LSTM数据集,如何正确地进行归一化操作,并建立了一个实例供读者参考。其中代码参考了不少网友的代码,如有侵权,请联系本人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

归一化与反归一化在Bi-LSTM多特征时序预测中应用(附实操代码) 的相关文章

随机推荐

  • Vue基础(二)——模板语法

    一 指令 1 v bind 绑定属性 2 v on 绑定事件 3 v if和v show 1 介绍
  • tcp/ip在物理层/数据链路层 实现简单抓包

    socket的精妙之处在于协议族的横向转换和地址族的纵向转换 我们也可在更底层实现对流经host的数据流的监督和修改 尤其是监察数据 十分简单 这里是混杂模式实现对ip数据流的监察与对tcp数据流的简单查看 需要root权限 这里忽略了tc
  • 整理一下go的ci工具

    代码格式化 go fmt fileName go goimports 自动格式化import goimports w fileName go mod 自动更新 删除包 go mod tidy 检查注释是否符合导出 1 安装revive go
  • 关于如何修复烧写镜像文件失败的SD卡

    前言 使用某些软件 比如 win32 Disk Imager 向SD卡烧写镜像文件时 很有可能出现烧写失败的情况 通常如果烧写失败 系统会弹出请求格式化SD卡的提示框 此时不要点格式化 点了可能会造成不可挽救的结果 也可能不会 而是进行以下
  • 【C库函数】memcpy函数详解

    目录 memcpy 函数原型 参数讲解 返回值讲解 函数讲解 三个注意点 memcpy 拷贝内存块到目标空间 函数原型 void memcpy void dest const void src size t count 参数讲解 参数 de
  • 百度AI──自然语言处理使用教程

    百度AI 自然语言处理使用教程 情感倾向分析 创建自己的应用 python方式调用 安装Python SDK 创建一个 Python SDK客户端 配置AipNlp 调用接口 情感倾向分析 需要注意的几个点 完整代码 参考 创建自己的应用
  • Linux 配置 PaddleOCR环境

    配置环境 1 准备好CUDA和cudnn 安培架构GPU需配置CUDA 11 2 CUDNN 8 1 1 以下文档以安培架构GPU的为例 找到对应的版本下载CUDA https developer nvidia com cuda downl
  • 一位数组返回id和pid通过这两个参数转换为树形结构数据,和树形结构的渲染

    废话不多说直接上代码 html代码我是引用了一个jq的插件作为样式插件名字为 jOrgChart 具体内容大家可以评论到下方 div class com div class TheEditor 编辑 div div div div js代码
  • Java 实体设置指定日期格式

    import com fasterxml jackson annotation JsonFormat JsonFormat pattern yyyy MM dd HH mm ss timezone GMT 8 private Date cr
  • nginx 代理图片服务器

    location gif jpg jpeg png expires 24h root home sk ftp 指定图片存放路径 proxy store on proxy store access user rw group rw all r
  • MATLAB BP神经网络 笔记整理

    1 如何更改输出层的激活函数 传递函数 对于有两层神经网络结构 可以通过调用以下函数 net layers 1 or 2 transferFcn for the hidden net layers 3 transferFcn for the
  • C#实现遍历文件夹获取指定后缀名文件

    问题描述 项目需要 要进行某文件夹下所有shp数据的读取 解决方法 using System using System Collections Generic using System ComponentModel using System
  • Python机器学习/数据挖掘项目实战 波士顿房价预测 回归分析

    Python机器学习 数据挖掘项目实战 波士顿房价预测 回归分析 此数据源于美国某经济学杂志上 分析研究波士顿房价 Boston HousePrice 的数据集 在这个项目中 你将利用马萨诸塞州波士顿郊区的房屋信息数据训练和测试一个模型 并
  • Qt之一个类成员函数调用另一个类成员的方法

    原文 https blog csdn net qq 35721743 article details 83592415 在继承之外 在C 中一个类成员函数调用另一个类成员的方法主要有 类的组合 友元类 类的前向声明 单例模式等 下面主要讲讲
  • gym 101512 BAPC 2014 I Interesting Integers

    Problem codeforces com gym 101512 attachments vjudge net contest 186506 problem I Meaning 给出一个 正整数 n 要找尽量小的 a 和 b a lt b
  • 面向对象三大特性之一——多态详解

    目录 前言 一 多态的概念 二 多态的定义及实现 1 虚函数的概念 2 虚函数的重写 2 1概念 2 2虚函数重写的两个例外 3 多态的构成条件 4 c 11 override和final 4 1 final 4 2 override 5
  • Java(五)-Java集合(comparable,map,list

    集合 Collection集合 集合的概念 ArrayList就是一个集合 集合是Java提供的一种容器 可以用来存储多个数据 集合与数组的区别 1 数组的长度是固定的 集合的长度是可变的 2 数组中存储的是同一类型的元素 可以存储基本数据
  • C++ 和 C 使用的不同点(待定)

    1 结构体 C 中定义的结构体 不起别名的情况下使用时要添加 struct C 可以不用添加 struct 直接使用定义的结构体名称 struct Student int age char name C 不报错 C报错 Student Ge
  • JDK的监听 Spring的事件监听机制

    一 概述 使用场景 用户注册完成时 需要给该用户发送邮件 发送优惠劵等等操作 实现业务的解耦 MQ的异步 销峰 解耦 大体步骤 1 UserService 在完成自身的用户注册逻辑之后 仅仅只需要发布一个 UserRegisterEvent
  • 归一化与反归一化在Bi-LSTM多特征时序预测中应用(附实操代码)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 前言 一 Bi LSTM 是什么 二 为什么要归一化和反归一化 1 归一化的好处 2 反归一化的好处 三 归一化和反归一化使用的公式 1 归一化 2 反归一化 四 实操