LSTM模型预测新冠

2023-11-05

LSTM是RNN的改进型,传统RNN模型会随着时间区间的增长,对早期的因素的权重越来越低,有可能会损失重要数据。而LSTM模型通过遗忘门、输入门、输出门三个逻辑,来筛选和保留数据。
原理详解可以参考如何从RNN起步,一步一步通俗理解LSTM这个博主讲的非常通俗易懂,本文主要是项目实操。

实验环境

Windows11、python3.8、Keras框架、Tensorflow

实验目的

使用新冠疫情历史每日新增感染人数数据训练LSTM模型,然后用此模型预测未来21天每日新增感染人数,这里将对数据集进行一阶差分以保证数据平稳性(根据数据具体情况处理)

实验数据介绍在这里插入图片描述

数据归一化

为了加快模型收敛速度,这里将对实验数据进行归一化,本文使用sklearn库中的MinMaxScaler方法,将实验数据压缩到0到1之间

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
dataset_sc = scaler.fit_transform(temp)
#dataset_sc为归一化后的数据,temp为原始数据

制作时间滑动窗口

由于LSTM模型输入数据格式的要求,使用LSTM模型需要制作时间滑动窗口,如下图

在这里插入图片描述
上图即使一个时间窗口,含义为用前10天的历史数据预测后一天的值,而预测值作为验证数据,用以计算预测值与真实值的误差。
但实际上我们不止11个数据,我们有上百个数据,所以得让时间窗口滑动起来,如下图所示
在这里插入图片描述
时间滑动窗口制作代码如下

#dataset为数据集
#timestep为准备使用的历史数据的步长
#dataX为时间窗口的输入值
#dataY为时间窗口的预测值(真实值)
def create_dataset(dataset, timestep ):
    dataX, dataY = [], []
    for i in range(len(dataset)-timestep -1):
        a = dataset[i:(i+timestep )]
        dataX.append(a)
        dataY.append(dataset[i + timestep])
    return np.array(dataX),np.array(dataY)
timestep  = 10
trainX1,trainY1  = create_dataset(dataset_sc,timestep )
#把输入值的列表变换为符合LSTM输入格式的形式
trainX = np.reshape(trainX1, (trainX1.shape[0], trainX1.shape[1], 1))

构建模型并训练

本文使用单层LSTM层,并加上一层Dropout层防止过拟合。使用MSE作为损失函数,MAPE作为评价指标,模型构建代码如下

from keras.models import Sequential
from keras.layers import LSTM,Dense,Dropout
import tensorflow as tf
from sklearn import metrics

units =30#LSTM层单元数
rate=0.3#Dropout损失率
epochs=590
batch_size=64
optimizer=tf.keras.optimizers.Adam(learning_rate=0.01)#使用Adam优化器
model = Sequential()#序贯模型
model.add(LSTM(units = units,activation='tanh', input_shape = (None,1)))
model.add(Dropout(rate=rate))
model.add(Dense(units = 1,activation='linear'))#采用linear激活函数
model.compile(loss='mean_squared_error', optimizer=optimizer,metrics='mape')
model.fit(trainX, trainY1, epochs=epochs, batch_size=batch_size, verbose=1)#训练

对训练结果和预测结果进行可视化

train_pre=model.predict(trainX)
plt.figure(figsize=(15, 8))
train_pre=scaler.inverse_transform(train_pre)#反归一化
trainY1_pre=scaler.inverse_transform(trainY1)#反归一化
plt.plot(range(496),trainY1_pre,range(496),train_pre)
plt.legend(['true','pre'])

训练数据集的预测结果如下图
在这里插入图片描述

截取前100个数据进行放大观察
在这里插入图片描述

预测未来

首先我们要知道,这个时间窗口只能往后预测一个值,但是本文的目的是预测未来21天的值。目前有多种方法,一种是seq2seq,顾名思义直接用一段序列预测下一段序列,但是本文采用迭代预测法,即将预测出来的值,又作为下一个时间窗口的输入值,以此来迭代预测,如下图所示
在这里插入图片描述
代码如下:

#测试集
test_data=diff2[-timestep-pre_day:-pre_day]#用于预测第一天
test_data=np.array(test_data)#转化为数组
test_data = test_data.astype('float32')#转化为浮点数
li_test=list(test_data.reshape(timestep))#转化为list
for i in range(pre_day):
    temp=np.array(li_test[-timestep:]).reshape(timestep,1)#取列表最后timestep个值输入
    test_data2 = scaler.fit_transform(temp)#归一化
    test_data3=test_data2.reshape(1,timestep,1)#转化为LSTM需要的输入格式
    re1=model.predict(test_data3)#预测结果
    re2=scaler.inverse_transform(re1)#反归一化
    li_test.append(float(re2))#将预测值转化为float添加的列表末尾

这段代码因为涉及到数据类型的转化,可能比较难以理解,如有不懂,可在评论区留言。

测试集结果如下
在这里插入图片描述
由于模型参数没有讨论,所以看起来预测结果比较差,但通过调参后(本文采用网格搜索),结果会好很多

实验结果

最后通过调参调整模型,并对结果进行反差分,得到的未来21天每日新增感染人数预测值与真实值结果如下图:
在这里插入图片描述
正方形虚线为真实值,三角形实线为预测值

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

LSTM模型预测新冠 的相关文章

随机推荐

  • 策略+工厂+反射记录一次switch代码简化过程

    遇到的问题 一张记录表 记录了10个业务的字段 一个入参type说明了要修改哪个字段 最初是通过switch type case 来做的 但是涉及这样子的判断多了 每次都要不断的switch 并且case里面不同方法有不同的处理 一个公共的
  • 河南省历年高考人数(2004-2021)

    河南省历年高考人数 2004 2021 年份 人数 万人 2004 59 55 2005 72 2006 78 2007 87 88 2008 98 8 2009 95 9 2010 95 24 2011 85 5 2012 80 5 20
  • 系统还原服务器,服务器系统还原

    服务器系统还原 内容精选 换一换 1 说明2 制作系统还原盘3 测试恢复还原1 说明http clonezilla nchc org tw clonezilla live download clonezilla live 2 6 7 28
  • 单调队列的学习 - 滑动窗口求最大/小值 (Leetcode 239, Sliding Window Maximum)

    这几天在学习单调队列和单调栈 感觉下面几篇博客讲的比较好 http www cnblogs com saywhy p 6726016 html http dping26 blog 163 com blog static 1795662172
  • 基于UDP实现双工通信(JAVA)(多线程)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 总结 前言 写个基础的JAVA网络程序 实现双工通信 一 两个类 1 一个累 代码如下 示例 import java io IOException impor
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 合并日志树——LSM Tree

    一 背景 大数据情景下 需要巨量的读写数据 即良好的IO效率 传统的B树以及其变种无法满足 因为它的读写在物理上是随机的 这样IO的效率就不高 于是便有了LSM log structed merge tree 合并日志树这个设计思想或者说存
  • Latex字体加粗

    You latex 字体加粗 什么代码 ChatGPT 在 LaTeX 中 要使文本加粗 可以使用 textbf 命令或 bfseries命令 以下是示例代码 使用 textbf 命令 textbf This is bold text 使用
  • QTREE5 - Query on a tree V【LCT】

    题目链接 你被给定一棵n个点的树 点从1到n编号 每个点可能有两种颜色 黑或白 我们定义dist a b 为点a至点b路径上的边个数 一开始所有的点都是黑色的 要求作以下操作 0 i 将点i的颜色反转 黑变白 白变黑 1 v 询问dist
  • Snipaste 使用方法

    下载 Snipaste 下载完成后 解压文件如图 双击Snipaste exe后 可以看到状态栏中有 右键图标可以看到详细配置信息 按需配置即可 截图之后点击下图红框图钉可以钉住截图区域
  • python 笔记:PyTrack(将GPS数据和OpenStreetMap数据进行整合)【官网例子解读】

    论文笔记 PyTrack A Map Matching Based Python Toolbox for Vehicle Trajectory Reconstruction UQI LIUWJ的博客 CSDN博客4 0 包的安装 官网的两种
  • JavaWeb实现查询功能

    写在前面 你们好 我是小庄 很高兴能和你们一起学习JavaWeb 如果您对Java感兴趣的话可关注我的动态 写博文是一种习惯 在这过程中能够梳理知识和巩固知识点 需求 当搜索框为空时 查询数据库所有商品 输入商品名时 进行模糊查询 实现思路
  • SpringBoot JPA 中无法注入 JpaRepository 接口的问题及解决方案

    错误 No qualifying bean of type xxx xxx xxx available expected at least 1 bean which qualifies as autowire candidate Depen
  • C语言输出100以内的全部素数。

    include
  • matlab练习程序(灰度、二值图像腐蚀膨胀)

    cl img gray imread fupeng jpg img erzhi imread erzhi fupeng jpg imshow img gray figure imshow img erzhi m n size img gra
  • 文件目录大小

    题目描述 一个文件目录的数据格式为 目录id 本目录中文件大小 子目录id列表 其中目录id全局唯一 取值范围 1 200 本目录中文件大小范围 1 1000 子目录id列表个数 0 10 例如 1 20 2 3 表示目录1中文件总大小是2
  • 解决 vba 报错:要在64位系统上使用,请检查并更新Declare 语句

    将错误处的 Declare 替换成 Declare PtrSafe 即可
  • java正则

    一 Pattern类和Matcher类 java util regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包 它包括两个类 Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表
  • docker 安装向量数据库 Milvus

    Miluvs 官网为 www milvus io Milvus 向量数据库能够帮助用户轻松应对海量非结构化数据 图片 视频 语音 文本 检索 单节点 Milvus 可以在秒内完成十亿级的向量搜索 请参考 在线教程 分布式架构亦能满足用户的水
  • LSTM模型预测新冠

    LSTM是RNN的改进型 传统RNN模型会随着时间区间的增长 对早期的因素的权重越来越低 有可能会损失重要数据 而LSTM模型通过遗忘门 输入门 输出门三个逻辑 来筛选和保留数据 原理详解可以参考如何从RNN起步 一步一步通俗理解LSTM这