R 2火灾温度预测

news2024/11/17 15:33:10

火灾温度预测

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

使用LSTM进行时间序列预测

这周学习如何使用长短期记忆网络(LSTM)进行时间序列预测。使用PyTorch框架来构建和训练模型,基于一个包含温度、CO浓度以及烟灰浓度的数据集。

1. 数据预处理

首先,需要对数据进行预处理。数据集中的特征包括温度(Tem1)、CO浓度(CO 1)、以及烟灰浓度(Soot 1)。我们将这些特征标准化,并构建输入序列X和目标值y

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler

data = pd.read_csv("woodpine2.csv")

plt.rcParams['savefig.dpi'] = 500  # 图片像素
plt.rcParams['figure.dpi'] = 500  # 分辨率

fig, ax = plt.subplots(1, 3, constrained_layout=True, figsize=(14, 3))

sns.lineplot(data=data["Tem1"], ax=ax[0])
sns.lineplot(data=data["CO 1"], ax=ax[1])
sns.lineplot(data=data["Soot 1"], ax=ax[2])
plt.show()

# 数据归一化
dataFrame = data.iloc[:, 1:].copy()
sc  = MinMaxScaler(feature_range=(0, 1))

for i in ['CO 1', 'Soot 1', 'Tem1']:
    dataFrame[i] = sc.fit_transform(dataFrame[i].values.reshape(-1, 1))

width_X = 8
width_y = 1

# 构建输入序列X和目标值y
X = []
y = []

in_start = 0

for _, _ in data.iterrows():
    in_end = in_start + width_X
    out_end = in_end + width_y

    if out_end < len(dataFrame):
        X_ = np.array(dataFrame.iloc[in_start:in_end, ])
        y_ = np.array(dataFrame.iloc[in_end:out_end, 0])

        X.append(X_)
        y.append(y_)

    in_start += 1

X = np.array(X)
y = np.array(y).reshape(-1, 1, 1)
2. 构建LSTM模型

接下来,使用PyTorch构建一个两层的LSTM模型。模型输入为前8个时间步的Tem1CO 1Soot 1数据,输出为第9个时间步的Tem1值。

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import TensorDataset, DataLoader

class model_lstm(nn.Module):
    def __init__(self):
        super(model_lstm, self).__init__()
        self.lstm0 = nn.LSTM(input_size=3, hidden_size=320,
                             num_layers=1, batch_first=True)

        self.lstm1 = nn.LSTM(input_size=320, hidden_size=320,
                             num_layers=1, batch_first=True)
        self.fc0 = nn.Linear(320, 1)

    def forward(self, x):
        out, hidden1 = self.lstm0(x)
        out, _ = self.lstm1(out, hidden1)
        out = self.fc0(out)
        return out[:, -1:, :]
3. 模型训练

使用均方误差(MSE)作为损失函数,并采用随机梯度下降(SGD)优化器。训练过程中,我们会记录训练损失和测试损失,并绘制其变化曲线。

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model_lstm().to(device)
loss_fn = nn.MSELoss()
opt = torch.optim.SGD(model.parameters(), lr=1e-1, weight_decay=1e-4)
epochs = 50
train_loss = []
test_loss = []
lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(opt, epochs)

def train(train_dl, model, loss_fn, opt, lr_scheduler=None):
    size = len(train_dl.dataset)
    num_batches = len(train_dl)
    train_loss = 0

    for x, y in train_dl:
        x, y = x.to(device), y.to(device)
        pred = model(x)
        loss = loss_fn(pred, y)

        opt.zero_grad()
        loss.backward()
        opt.step()

        train_loss += loss.item()

    if lr_scheduler is not None:
        lr_scheduler.step()
    train_loss /= num_batches
    return train_loss

def test(dataloader, model, loss_fn):
    num_batches = len(dataloader)
    test_loss = 0

    with torch.no_grad():
        for x, y in dataloader:
            x, y = x.to(device), y.to(device)
            y_pred = model(x)
            loss = loss_fn(y_pred, y)
            test_loss += loss.item()

    test_loss /= num_batches
    return test_loss

for epoch in range(epochs):
    model.train()
    epoch_train_loss = train(train_dl, model, loss_fn, opt, lr_scheduler)

    model.eval()
    epoch_test_loss = test(test_dl, model, loss_fn)

    train_loss.append(epoch_train_loss)
    test_loss.append(epoch_test_loss)

    template = ('Epoch:{:2d}, Train_loss:{:.5f}, Test_loss:{:.5f}')
    print(template.format(epoch + 1, epoch_train_loss, epoch_test_loss))

plt.figure(figsize=(5, 3), dpi=120)
plt.plot(train_loss, label='LSTM Training Loss')
plt.plot(test_loss, label='LSTM Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()
4. 预测与评估

最后,使用训练好的模型对测试集进行预测,并计算模型的均方根误差(RMSE)和决定系数(R²)。

# 预测并将数据移回 CPU 进行逆变换
predicted_y_lstm = sc.inverse_transform(model(X_test).detach().cpu().numpy().reshape(-1, 1))
y_test_1 = sc.inverse_transform(y_test.reshape(-1, 1))

# 转换为列表形式
y_test_one = [i[0] for i in y_test_1]
predicted_y_lstm_one = [i[0] for i in predicted_y_lstm]

# 绘制真实值和预测值
plt.figure(figsize=(5, 3), dpi=120)
plt.plot(y_test_one[:2000], color='red', label='真实值')
plt.plot(predicted_y_lstm_one[:2000], color='blue', label='预测值')
plt.title('预测结果对比')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

from sklearn import metrics
RMSE_lstm = metrics.mean_squared_error(predicted_y_lstm_one, y_test_1) ** 0.5
R2_lstm = metrics.r2_score(predicted_y_lstm_one, y_test_1)

print('均方根误差: %.5f' % RMSE_lstm)
print('R2: %.5f' % R2_lstm)
5.结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

这周学习了如何使用LSTM模型进行时间序列预测,并掌握数据预处理、模型构建、训练、预测及模型评估的全流程,对lstm模型的使用有了初步了解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大数据算法】一文掌握大数据算法之:时间亚线性算法。

时间亚线性算算法 1、引言2、时间亚线性算法2.1 定义2.2 分类2.3 核心原理2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;大数据算法知识难不难啊&#xff1f; 小鱼&#xff1a;你在职场打拼这么多年&#xff0c;竟然还能问出来这个问题。 小屌…

婚恋交友系统该如何制作成品系统?

制作婚恋交友系统的成品系统是一个综合性的过程&#xff0c;涉及多个关键步骤和技术要点。以下是一个详细的制作流程&#xff1a; 1. 需求分析 市场调研&#xff1a;首先需要对婚恋交友市场进行深入调研&#xff0c;了解目标用户群体的需求、喜好、习惯以及市场痛点。用户画像…

C学习(数据结构)--> 实现顺序结构二叉树

目录 一、堆的概念与结构 性质 二叉树的性质 二、堆的实现 1、结构 2、初始化与销毁 3、入堆与出堆&#xff08;小堆&#xff09; 1&#xff09;Swap 2&#xff09;入堆 1 数据的向上调整 2 入堆 3&#xff09;出堆 1 数据的向下调整 2 出堆 三、其他 1、入堆与出…

解决Github无法连接codespace情况

使用这个DNS即可 CN - 中国互联网络信息中心CNNIC SDNS1.2.4.8,,True 参见&#xff1a; GitHub 无法访问解决办法 - 哔哩哔哩

一些可以参考的文档集合17

应用运行主目录 之前的文章集合: 一些可以参考文章集合1_xuejianxinokok的博客-CSDN博客 一些可以参考文章集合2_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合3_xuejianxinokok的博客-CSDN博客 一些可以参考的文档集合4_xuejianxinokok的博客-CSDN博客 一些可以…

乱弹篇(42)处暑与吃秋

“太热了。8点收竿&#xff0c;匆忙回家降温。”刚才完笔者把这话发给了微信亲友。 书画家黄老弟回复&#xff1a;“又是保长吧&#xff1f;天热了&#xff0c;鱼不出来。下次努力。” 知友家乡兰回复&#xff1a;“是啊&#xff0c;自贡已达40度&#xff01;” 在“电老虎”…

为什么录屏没有声音?教你三招,解决系统与麦克风声音录制技巧

电脑录屏声音同步技巧&#xff1a;系统与麦克风声音录制 在游戏录制和微课制作中&#xff0c;音画同步是保证观众体验的关键因素。无论是紧张刺激的游戏解说&#xff0c;还是知识传递的微课讲解&#xff0c;清晰同步的声音都能让内容更加生动&#xff0c;更能吸引观众的注意力…

【UE5.1】NPC人工智能——06 NPC攻击

目录 前言 效果 步骤 一、准备NPC狮子攻击的动画 二、NPC狮子攻击玩家造成伤害 前言 在上一篇中&#xff08;【UE5.1】NPC人工智能——05 给NPC添加视觉感知&#xff09;我们已经给NPC添加了感知功能&#xff0c;使其在感知到玩家后就跑向玩家。本篇要实现的功能是&#x…

赛力斯汽车改名问界汽车,字号随着商标改!

从国家企业信用网显示&#xff0c;近日赛力斯汽车企业名称变更为重庆问界汽车&#xff0c;以前余承东直播&#xff0c;谈到问界等商标品牌的转让&#xff0c;问界品牌价值至少100亿&#xff0c;赛力斯最终是25亿收购华为“问界”商标&#xff0c;估值102亿。 经常遇到有人问&am…

代码随想录Day 22| 回溯算法开篇,77.组合、216组合总和Ⅲ、17.电话号码的字母组合

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 回溯算法理论基础一、理论基础1.1 什么是回溯法1.2 回溯法的效率1.3 回溯法解决的问题1.4 如何理解回溯法1.5 回溯法模板 二、题目题目一&#xff1a;77.组合解题思路&#xff1a;回溯法三部曲组合…

碎碎念:关于小模型或者端侧大模型

今年有个有趣的现象&#xff0c;大厂分别推出能够在端侧运行的小模型 Microsoft&#xff1a;Phi-3 Vision 4.2b&#xff0c;支持 文本、图像输入&#xff0c;可以运行在 surface 上 Google&#xff1a;Gemini Nano 1.8b/3.2b&#xff0c;支持文本&#xff0c;可以运行在手机上…

SwiftUI 如何恣意定制和管理系统中的窗口(Window)

概览 在苹果大屏设备上,我们往往需要借助多窗口(Multiwindow)来充分利用海量的显示空间,比如 Mac,iPad 以及 AppleTV 系统 等等。 所幸的是,SwiftUI 对多窗口管理提供了很好的支持。利用 SwiftUI 我们可以非常轻松的设置窗口在屏幕上的位置,大小以及拖动反馈。 在本篇…

新版干货|互联网算法备案办理指南

一、什么是互联网算法备案 根据《互联网信息服务算法推荐管理规定》《互联网信息服务深度合成管理规定》和《生成式人工只能服务管理暂行办法》相关规定&#xff0c;需要进行互联网算法备案的主体包含具有舆论属性或者社会动员能力的算法推荐服务提供者、深度合成服务提供者、…

第五节:Nodify 节点位置设置

引言 如果你尝试过前几节的代码&#xff0c;会发现节点都是出现在0,0 位置&#xff0c;及编辑器左上角。编辑器作为最外层的交互控件&#xff0c;内部封装了节点容器ItemContrainer&#xff0c;我们通过样式属性对Loaction做绑定。本节将介绍如何配置节点位置。 1、节点位置 …

FPGA实现TMDS编码

1.TMDS编码 TMDS&#xff08;Transition Minimized Differential Signaling&#xff09;&#xff0c;即最小化差分传输信号&#xff0c;在DVI&#xff08;数字视频接口&#xff0c;只能传输视频&#xff09;和HDMI&#xff08;音视频均可传输&#xff09;协议中用于传输音视频…

适用于 Windows 的典型 PDF 编辑器程序

尽管 PDF 文件已经存在了很长时间&#xff0c;但我们仍然希望使用此类文件完成一些任务。其中一项任务是在我们的计算机上编辑它们&#xff0c;尤其是 Windows。但是&#xff0c;考虑到 PDF 文件是复杂数据的集合&#xff0c;它不会那么简单。因此&#xff0c;您将需要第三方应…

5分钟就能搭建 AI 聊天室场景!内含源代码,码住了!

近期奥运会的赛事观看火爆全网&#xff0c;大家在赛事直播间的聊天更是异常活跃&#xff0c;小编作为一个非足球爱好者&#xff0c;经常对直播解说中的「专有名词」充满迷惑。这时候特别想有一个 AI 数字人帮忙解惑。 这里&#xff0c;我们就利用云信的 AI 数字人&#xff0c;…

GraphRAG + Ollama 本地部署全攻略:避坑实战指南

—1— 为什么要对 GraphRAG 本地部署&#xff1f; 微软开源 GraphRAG 后&#xff0c;热度越来越高&#xff0c;目前 GraphRAG 只支持 OpenAI 的闭源大模型&#xff0c;导致部署后使用范围大大受限&#xff0c;本文通过 GraphRAG 源码的修改&#xff0c;来支持更广泛的 Embedd…

springboot之项目搭建并say hi

写在前面 本文看下如何搭建一个最简单的支持http接口的hello程序。 1&#xff1a;正文 接着引入springboot依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><v…