##19 序列与时间序列预测:运用RNN和LSTM在PyTorch中的实践

文章目录

  • 前言
    • 时间序列预测的基本概念
      • 关键概念
    • RNN及其局限性
    • LSTM网络的崛起
    • 用PyTorch进行时间序列预测
      • 准备数据集
      • 数据预处理
      • 创建数据加载器
      • 构建LSTM模型
      • 训练模型
      • 测试和评估模型
      • 结语


前言

随着数据的爆炸式增长,时间序列预测在多个领域内变得越来越重要。它能帮助我们分析过去、理解现在并预测未来。在本文中,我将深入探讨如何使用循环神经网络(RNN)和长短期记忆网络(LSTM)进行时间序列分析,具体实现将利用PyTorch框架。
在这里插入图片描述

时间序列预测的基本概念

时间序列预测指的是利用历史数据序列来预测未来某个时间点的值。不同于普通的回归问题,时间序列数据的特点是序列间存在时间上的依赖关系。

关键概念

  • 时间序列:按照时间顺序排列的数据点集合。
  • 趋势:时间序列的长期进展方向。
  • 季节性:时间序列显示的周期性波动。
  • 噪声:时间序列中不规则的、不可预测的波动。

RNN及其局限性

循环神经网络(RNN)是处理序列数据的一类神经网络,它通过循环的连接来传递信息,使得网络能够记忆之前的信息。然而,RNN也有其局限性,例如难以捕捉长期依赖关系,主要是因为梯度消失或梯度爆炸问题。

LSTM网络的崛起

为了克服RNN的短板,LSTM网络应运而生。LSTM通过引入三个门(遗忘门、输入门和输出门)和单元状态,能够有效地保留长期信息,缓解了梯度消失问题。

用PyTorch进行时间序列预测

接下来,我们将通过一个实例来具体展示如何使用PyTorch来完成一个时间序列预测的任务。

准备数据集

我们首先需要一个时间序列数据集。在这个例子中,假设我们已经有了一组股票市场的历史价格数据。

import pandas as pd
import numpy as np

# 载入数据集
data = pd.read_csv('stock_prices.csv', parse_dates=True, index_col='Date')

# 显示数据的前五行
print(data.head())

数据预处理

在开始模型构建之前,我们需要对数据进行预处理,包括归一化处理和划分训练集和测试集。

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler(feature_range=(-1, 1))
scaled_data = scaler.fit_transform(data.values.reshape(-1, 1))

# 划分训练集和测试集
train_data = scaled_data[:int(len(scaled_data)*0.8)]
test_data = scaled_data[int(len(scaled_data)*0.8):]

创建数据加载器

在PyTorch中,我们使用TensorDatasetDataLoader来创建数据加载器,它能够在训练时提供批次数据。

import torch
from torch.utils.data import TensorDataset, DataLoader

def create_inout_sequences(input_data, tw):
    inout_seq = []
    L = len(input_data)
    for i in range(L-tw):
        train_seq = input_data[i:i+tw]
        train_label = input_data[i+tw:i+tw+1]
        inout_seq.append((train_seq ,train_label))
    return inout_seq

seq_length = 5
train_inout_seq = create_inout_sequences(train_data, seq_length)

train_dataset = TensorDataset(torch.FloatTensor(train_inout_seq))
train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)

构建LSTM模型

接下来,我们创建一个LSTM模型类。

import torch.nn as nn

class LSTM(nn.Module):
    def __init__(self, input_size=1, hidden_layer_size=100, output_size=1):
        super().__init__()
        self.hidden_layer_size = hidden_layer_size

        self.lstm = nn.LSTM(input_size, hidden_layer_size)

        self.linear = nn.Linear(hidden_layer_size, output_size)

        self.hidden_cell = (torch.zeros(1,1,self.hidden_layer_size),
                            torch.zeros(1,1,self.hidden_layer_size))

    def forward(self, input_seq):
        lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq) ,1, -1), self.hidden_cell)
        predictions = self.linear(lstm_out.view(len(input_seq), -1))
        return predictions[-1]

model = LSTM()
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

训练模型

现在我们可以开始训练模型了。

epochs = 150

for i in range(epochs):
    for seq, labels in train_loader:
        optimizer.zero_grad()
        model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size),
                        torch.zeros(1, 1, model.hidden_layer_size))

        y_pred = model(seq)

        single_loss = loss_function(y_pred, labels)
        single_loss.backward()
        optimizer.step()

    if i%25 == 1:
        print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')

测试和评估模型

在训练结束后,我们应该在测试集上评估模型的性能。

model.eval()
test_inputs = train_data[-seq_length:].tolist()

for i in range(len(test_data)):
    seq = torch.FloatTensor(test_inputs[-seq_length:])
    with torch.no_grad():
        model.hidden = (torch.zeros(1, 1, model.hidden_layer_size),
                        torch.zeros(1, 1, model.hidden_layer_size))
        test_inputs.append(model(seq).item())

actual_predictions = scaler.inverse_transform(np.array(test_inputs[seq_length:] ).reshape(-1, 1))

结语

时间序列预测是一个复杂但极具价值的领域。在本文中,我们介绍了利用PyTorch和LSTM网络进行时间序列预测的基本步骤。通过适当的数据预处理、模型设计和参数调整,我们能够构建出强大的预测模型来解决现实世界中的问题。这只是时间序列预测的冰山一角,更多高级技术和方法在等待着有志之士去探索和实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/623526.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jenkins+docker实现前后端项目的自动化构建和容器部署

1、安装环境 centos 2、docker安装 yum install docker# 启动docker systemctl start docker 3、docker 安装jenkins 3.1 拉取jenkins镜像 docker pull jenkins/jenkins:latest-jdk8 3.2 启动jenkins容器 docker run -d --name jenkins -u root --privilegedtrue --res…

界面组件DevExpress Reporting v24.1预览版 - 拥有原生Angular报表查看器

DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。 下一个主要更新(v24.1)将于6月初发布&#xff…

JWT -- 复盘

1、前言 1.1、Token流程 先来回顾一下利用 token 进行用户身份验证的流程: 客户端使用用户名和密码请求登录服务端收到请求,验证用户名和密码验证成功后,服务端会签发一个 token,再把这个 token 返回给客户端客户端收到 token 后…

Linux进程(一) -- 介绍进程

计算机的系统架构 用户部分 这是用户直接与计算机交互的部分,包括以下三种操作: 指令操作:用户通过命令行界面(CLI)输入指令来操作计算机。开发操作:开发人员编写和调试程序代码,与计算机系统…

[AWS] stepfunctions-local

本质是本地docker,只支持异步调用 run aws-stepfunctions-localdocker run -p 8083:8083 \ --mount type=bind,readonly,source=/path/MockConfigFile.json,destination=/home/StepFunctionsLocal/MockConfigFile.json \ -e SFN_MOCK_CONFIG="/home/StepFunctionsLocal/…

照明灯具十大排名都有哪些?市面上比较流行的十大护眼台灯品牌推荐

照明灯具十大排名都有哪些?护眼台灯排名当中靠前的主要有书客、飞利浦、松下等品牌。照明灯具作为家居与办公环境中不可或缺的元素,其品质与选择直接关系到人们的视觉健康与舒适度。本文将为大家揭示照明灯具的十大排名,让大家了解市场上最受…

【科学研究】 女性主义:网络中的性别歧视现象

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

识别AI论文生成内容,降低论文高AI率

AI写作工具能帮我们在短时间内高效生成一篇毕业论文、开通报告、文献综述、任务书、调研报告、期刊论文、课程论文等等,导致许多人开始使用AI写作工具作为撰写学术论文的辅助手段。而学术界为了杜绝此行为,开始使用AIGC检测系统来判断文章是由AI生成还是…

TL(TypeLetters)功能扩展#002:解放CPU。带打字练习软件原理分析

TL(TypeLetters)功能扩展#002: 解放CPU,带打字练习软件原理分析。 今天Type Letters时发现一个问题,TL的CPU占用达到了14%,按说一个小小的打字练习软件,不会有这么高的CPU占用率,是什…

「Qt Widget中文示例指南」如何实现一个快捷编辑器(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 快捷编辑器示例展示…

1U机架式多卡聚合设备在视频指挥车上的应用解决方案

随着信息技术的飞速发展,视频指挥车作为现代化指挥系统的重要组成部分,在各类应急指挥调度中发挥着越来越重要的作用。而1U机架式多卡聚合设备,以其高带宽、高可用性和高稳定性的特点,成为视频指挥车中不可或缺的关键设备。本文将…

Softing工业新版dataFEED OPC Suite支持访问SINUMERIK 840D数控机床

2024年4月17日(哈尔),Softing工业自动化宣布发布dataFEED OPC Suite V5.35新版。该版本支持访问SINUMERIK 840D数控机床数据,并集成了Web服务功能。 (dataFEED OPC Suite V5.35支持访问SINUMERIK 840D数控机床&#xf…

腾讯云服务器部署前后端服务

服务器:OpenCloudOS (兼容centos8) 后端:javaSpringboot 前端:Vue 下载jdk 1)下载jdk11 wget https://download.java.net/openjdk/jdk11/ri/openjdk-1128_linux-x64_bin.tar.gz 2)解压jdk …

基于微信小程序+JAVA Springboot 实现的【停车场小程序】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称: 停车场微信小程序的设计与实现 在当前信息技术飞速发展的背景下,停车场微信小程序的开发成为了一个创新的解决方案,旨在提高停车场管理的效率和用户的停车体验。本项目通过深入分析现有停车场管理系统的不足&#xff0c…

硬件FMEA与软件FMEA的区别——FMEA软件

​免费试用FMEA软件-免费版-SunFMEA 在产品开发和制造过程中,失效模式与影响分析(FMEA)作为一种预防性的质量工具,对于确保产品性能和质量至关重要。然而,硬件FMEA和软件FMEA在应用和实践方面存在显著的区别。本文旨在…

第51期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

双星号(**)和单星号(*)在Python参数传递中的妙用

在Python中,参数传递是一个非常重要的概念,它允许函数接收任意数量的参数。而双星号(**)和单星号(*)在参数传递中扮演着关键角色。本文将详细讲解这两个符号的用法,并通过示例代码帮助初学者理解它们的工作原理。 单星号(*) 单星号(*)用于函…

华为配置带反射器的iNOF功能实验

配置带反射器的iNOF功能示例 适用产品和版本 安装了SAN系列单板的CE16800系列交换机V300R020C10或更高版本。 安装了P系列单板的CE16800系列交换机V300R021C00或更高版本。 CE6866、CE6866K、CE8851-32CQ8DQ-P、CE8851K系列交换机V300R020C00或更高版本。 CE6860-SAN、CE8850-S…

MyBatis——动态 SQL

一、if 标签 <mapper namespace"com.powernode.mybatis.mapper.CarMapper"><select id"selectByMultiCondition" resultType"car">select * from t_car where<if test"brand ! null and brand ! ">brand like #{br…

【Docker】docker 镜像如何push到私有docker仓库

文章目录 一、 网址解析对于Linux和macOS系统&#xff1a;对于Windows系统&#xff1a; 二、 镜像push 一、 网址解析 希望 registry.meizu.com 能够解析到内网IP地址&#xff08;例如10.128.17.157&#xff09;&#xff0c;您可以通过修改主机的 hosts 文件来实现。 hosts 文…