第39周:文献阅读
目录
摘要
Abstract
文献阅读
问题引入
研究背景
研究意义
研究目的
创新点
模型结构创新
考虑多因素预测
相关工作
RNN
GRU
CNN
提出模型
基于GRU的单水站水位预测
基于GRU的多水站水位预测
基于GRU-CNN的多水站水位预测
实验研究
数据集选取
对比分析
模型评估
结论与展望
结论
未来工作
总结
摘要
该文献首先阐述了研究背景、目的,接着介绍相关技术及水位数据集,再详细描述基于GRU和CNN - GRU的预测模型,随后展示实验结果、对比分析各模型效果,最后得出结论并展望未来。其特点在于结合深度学习技术,利用大量实际数据构建模型。优势在于CNN - GRU模型能综合时空因素,降低单一数据影响,预测精度较高。该模型应用于长江南京航道局公共服务平台,为船舶航行和航程规划提供智能水位预测服务,因其考虑多水位站空间相关性,更符合实际需求。对比ARIMA、WANN和LSTM等模型,CNN - GRU模型在多数评估指标上表现更优。未来可通过研究潮汐影响、运用聚类方法优化模型,进一步提升预测准确性和可靠性。
Abstract
This literature first elaborates on the research background and objectives, followed by an introduction to relevant technologies and water level datasets. It then provides a detailed description of prediction models based on GRU and CNN-GRU, followed by presenting experimental results, comparing and analyzing the effectiveness of each model, and finally drawing conclusions and looking forward to the future. Its characteristic is to combine deep learning technology and use a large amount of actual data to build models. The advantage of the CNN-GRU model is that it can integrate spatiotemporal factors, reduce the impact of a single data, and achieve high prediction accuracy. This model is applied to the public service platform of the Yangtze River Nanjing Navigation Bureau, providing intelligent water level prediction services for ship navigation and voyage planning. As it considers the spatial correlation of multiple water level stations, it is more in line with practical needs. Compared to ARIMA, WANN, and LSTM models, the CNN-GRU model performs better on most evaluation metrics. In the future, the accuracy and reliability of predictions can be further improved by studying the influence of tides and optimizing models using clustering methods.
文献阅读
title:Water Level Prediction Model Based on GRU and CNN
Water Level Prediction Model Based on GRU and CNN | IEEE Journals & Magazine | IEEE Xplore
问题引入
研究背景
随着物联网技术在长江等内河的应用,大量水位数据得以收集。内河水位对船舶航行和合理装载意义重大,准确预测水位中期趋势有助于航道维护、提升交通安全与通行能力。目前,利用历史水位数据,通过统计和机器学习技术构建模型进行水位预测是主流方法,众多学者运用支持向量机、人工神经网络、自回归积分滑动平均模型等多种模型及混合方法开展研究,但利用深度神经网络预测水位的探讨较少。
研究意义
本研究提出的基于 GRU 和 CNN 的水位预测模型,相比传统模型有更高精度,为内河水位预测提供了更有效的方法。
研究目的
本研究旨在利用收集的水位数据构建深度神经网络模型,提高水位预测精度。通过考虑数据收集的时间和传感器位置因素,结合门控循环单元(GRU)和卷积神经网络(CNN)的网络结构,构建 CNN - GRU 模型。其中,GRU 用于学习水位变化趋势,CNN 用于学习相邻水位站数据的空间相关性,以此来分析水位时空数据关系,实现更精准的水位预测。
创新点
模型结构创新
提出 CNN - GRU 模型预测水位,结合 GRU 和 CNN 的优势。GRU 学习水位变化趋势,CNN 捕捉相邻水位站数据的空间相关性,综合时空特征提升预测精度,降低单一水位站异常值和数据随机性的影响。
考虑多因素预测
构建模型时,充分考虑数据收集的时间因素和传感器位置因素。利用多水位站数据预测中间站水位,更全面地反映实际水位变化情况,使模型更贴合内河水位变化的复杂特性,提高预测准确性。
相关工作
该文献介绍了几种相关的深度学习模型来解决时间序列的预测问题,分别是基于CNN、基于RNN和基于GRU的模型
RNN
RNN的基本结构是一个循环单元,它包含一个输入层、一个隐藏层和一个输出层。在每一个时间步上,网络接收一个输入向量和一个隐藏状态向量,通过一个非线性函数对它们进行组合,然后产生一个输出向量和一个新的隐藏状态向量,作为下一个时间步的输入和隐藏状态。
这种反馈机制可以使得网络记忆之前的信息,并在处理序列数据时考虑到历史信息。
网络的训练步骤:正向传播——计算损失——反向传播——更新梯度
问题1:在长序列任务中,RNN容易出现梯度消失或梯度爆炸的问题,导致模型难以训练。
解决1:GRU模型可以减少梯度消失的问题。
问题2:计算效率相对较低,因为需要在每个时间步都进行前向传播和反向传播的计算。
解决2: CNN模型可以实现权重共享,以此来提高计算效率。
RNN模型的代码定义
class RNNModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers):
super(RNNModel, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True) # 使用RNN
self.fc = nn.Linear(hidden_size, 1) # 输出层
def forward(self, x):
# 初始化隐藏状态
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device)
# 前向传播
out, _ = self.rnn(x, h0) # RNN输出形状为 (batch_size, seq_length, hidden_size)
out = self.fc(out[:, -1, :]) # 只取最后一个时间步的输出
return out
# 实例化模型
input_size = window_size + 2 # 输入特征维度
hidden_size = 64 # 隐藏层大小
num_layers = 2 # RNN层数
model = RNNModel(input_size, hidden_size, num_layers)
参考文章:时间序列预测(六)——循环神经网络(RNN)_时间序列神经网络-CSDN博客
GRU
GRU是一种循环神经网络(RNN)的变体。相比于传统的RNN,GRU引入了门控机制,可以通过该机制来确定应该何时更新隐状态,以及应该何时重置隐状态,使得网络能够更好地捕捉长期依赖性,同时减少了梯度消失的问题。
与RNN相同的是GRU也是直接使用上一层的隐藏状态,但是与其不同的是GRU在更新和重置隐藏状态的时间并不是每层不变的,而是由门控机制所决定的。GRU有两个门控,一个更新门、一个重置门
更新门:决定了当前时刻隐藏状态中旧状态和新候选状态的混合比例
重置门:用于控制前一时刻隐藏状态对当前候选隐藏状态的影响程度
GRU模型代码定义
# 2. 创建GRU模型
class GRUModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super(GRUModel, self).__init__()
self.gru = nn.GRU(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
h0 = torch.zeros(self.gru.num_layers, x.size(0), self.gru.hidden_size).to(x.device)
out, _ = self.gru(x, h0)
return self.fc(out[:, -1, :]) # 只取最后一个时间步的输出
# 实例化模型
model = GRUModel(input_size, hidden_size, num_layers, output_size)
gru模型隐藏层的步骤:
参考文章:时间序列预测(九)——门控循环单元网络(GRU)_门控循环单元(gru)-CSDN博客
CNN
CNN 最初是为图像数据设计的,但它的特性(如局部感受野和权重共享)在捕捉时间序列数据中的局部模式和相邻关系时也非常有效。根据它的特点能够做到:局部特征提取(卷积核的学习模式)、权重共享(不同时间步学习相同的模式)、有效降维(池化操作)。
多通道的CNN模型代码定义
import torch
import torch.nn as nn
class MultiChannelCNN(nn.Module):
def __init__(self, input_channels, output_size, kernel_size=3, stride=1, padding=1):
"""
:param input_channels: 输入通道数目
:param output_size: 输出大小
:param kernel_size: 卷积核的大小
:param stride: 卷积步长
:param padding: 卷积的填充
"""
super(MultiChannelCNN, self).__init__()
# 定义多个一维卷积层
self.conv1 = nn.Conv1d(input_channels, 64, kernel_size, stride, padding) # 第一个卷积层
self.conv2 = nn.Conv1d(64, 128, kernel_size, stride, padding) # 第二个卷积层
self.conv3 = nn.Conv1d(128, 256, kernel_size, stride, padding) # 第三个卷积层
# 池化层
self.pool = nn.MaxPool1d(2) # 最大池化层,池化窗口大小为2
# 全连接层,后续用来输出最终结果
self.fc = nn.Linear(256 * 2, output_size) #其中 256 来自最后一个卷积层的输出通道数
# 假设时间序列长度为8,池化后为2的长度
def forward(self, x):
"""
:param x: 输入数据,形状为(batch_size, input_channels, sequence_length)
"""
# 通过第一个卷积层
x = self.conv1(x)
x = torch.relu(x) # 激活函数
x = self.pool(x) # 池化层
# 通过第二个卷积层
x = self.conv2(x)
x = torch.relu(x)
x = self.pool(x)
# 通过第三个卷积层
x = self.conv3(x)
x = torch.relu(x)
x = self.pool(x)
# 将输出展平,输入到全连接层
x = x.view(x.size(0), -1)
# 通过全连接层
x = self.fc(x)
return x
# 创建模型
model = MultiChannelCNN(input_channels, output_size)
# 输入形状为(batch_size, input_channels, sequence_length)
input_data = torch.randn(batch_size, input_channels, sequence_length)
# 前向传播
output = model(input_data)
print(output)
参考文章:时间序列预测(十九)——卷积神经网络(CNN)在时间序列中的应用_cnn预测时间序列-CSDN博客
提出模型
基于GRU的单水站水位预测
构建了三层的结构模型,包含输入层、gru隐藏层及全连接的输出层,利用输入的过去20天的水位数据预测未来5天的水位
基于GRU的多水站水位预测
考虑到相邻水位站数据相关性,构建基于多水位站数据的预测模型。
同样是构建了三层结构模型,包含输入层、gru隐藏层及全连接的输出层,其中输入的数据包含3个相邻的水位站,最终输出中间站未来5天的水位。
基于GRU-CNN的多水站水位预测
上述 GRU 模型虽考虑了相邻水位站相关性,但难以充分反映空间关系。CNN 在捕捉空间特征方面表现出色,因此将其与 GRU 结合构建水位预测模型。
该模型包含了一个输入层、一个输出层、三个卷积层和三个gru隐藏层。
代码实践
def build_gru_cnn_model(input_shape):
model = Sequential()
# 添加卷积层
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=input_shape))
model.add(Conv1D(filters=128, kernel_size=3, activation='relu'))
model.add(Conv1D(filters=256, kernel_size=3, activation='relu'))
# 添加GRU层
model.add(GRU(units=128, return_sequences=True, kernel_regularizer=l2(0.01)))
model.add(Dropout(0.2))
model.add(GRU(units=64, return_sequences=True, kernel_regularizer=l2(0.01)))
model.add(Dropout(0.2))
model.add(GRU(units=32, kernel_regularizer=l2(0.01)))
model.add(Dropout(0.2))
# 添加全连接层
model.add(Dense(units=5, activation='linear'))
# 编译模型
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
return model
实验研究
数据集选取
随着数字航道系统的建设,长江沿线通过物联网技术收集了大量水位数据,研究选取部分水位站每天 8 点的观测值构建数据集,这些数据呈周期性波动。为提高模型预测精度,先利用箱线图方法检测并替换异常值,再采用 Savitzky-Golay 滤波降噪。最后,将 30 年数据按 8:2 划分为训练集和测试集,并进一步按季节分为枯水期、中水期和洪水期,以此为后续模型研究做准备。
对比分析
上述模型的提出中,提出了三种模型的水位预测,分别是基于gru的单水站预测、基于gru的多水站预测以及基于gru-cnn的多水站预测。选取了三个季节水站的数据,能够更加全面的评估模型性能。
根据文献中的结果,其中展现了预测值和真实值的折线图,可以直观的看到3种不同模型在不同季节表现出预测结果都较为贴合实际值,所以需要进行更进一步的评估,利用评估指标及逆行衡量模型性能的好坏。
模型评估
评估指标
采用 Nash-Sutcliffe 效率系数(NSE)、平均相对误差(MRE)和均方根误差(RMSE)三个指标评估模型预测准确性。
Nash-Sutcliffe 效率系数(NSE) 是一种广泛用于评估模型预测性能的统计指标,尤其在水文模型中应用广泛,用于衡量模型预测值与观测值之间的一致性。
NSE 越接近 1、MRE 和 RMSE 越接近 0,表明模型预测效果越好。
代码实践
def nse(observed, predicted):
"""
计算 Nash-Sutcliffe 效率系数 (NSE)
:param observed: 观测值数组
:param predicted: 预测值数组
:return: NSE 值
"""
numerator = np.sum((observed - predicted) ** 2)
denominator = np.sum((observed - np.mean(observed)) ** 2)
return 1 - (numerator / denominator)
def mre(observed, predicted):
"""
计算平均相对误差 (MRE)
:param observed: 观测值数组
:param predicted: 预测值数组
:return: MRE 值
"""
return np.mean(np.abs((observed - predicted) / observed))
def rmse(observed, predicted):
"""
计算均方根误差 (RMSE)
:param observed: 观测值数组
:param predicted: 预测值数组
:return: RMSE 值
"""
return np.sqrt(np.mean((observed - predicted) ** 2))
结果分析
选取经典的机器学习算法ARIMA、WANN(小波人工神经网络) 和LSTM,以及上述提出的3种基于GRU的模型。
由上述结果可以看出,无论是旱季、中雨期还是汛期,基于GRU-CNN的模型在NSE上都更接近于1,而在MRE和RMSE上都更接近0,说明该模型的预测效果更佳。
结论与展望
结论
本研究利用深度神经网络进行内河水位预测,通过实验评估了基于 GRU 的预测模型和基于 CNN - GRU 的多水位站预测模型。结果表明,CNN - GRU 模型优于经典的 ARIMA 和 WANN 模型,具有更高的预测精度,且考虑多水位站空间相关数据能降低单一水位站数据随机性的影响。
未来工作
未来研究可从两方面展开,一是深入研究潮汐对长江下游感潮段水位预测精度的影响,将水位观测数据和潮汐信息相结合,进一步优化预测模型;二是运用聚类方法对不同河段水位数据进行聚类分析,提取重要环境因素,再利用聚类后的数据集训练 CNN - GRU 模型,以提高水位预测的准确性和可靠性。
总结
这周学习了GRU-CNN的模型相关的文献,分析对比了RNN、GRU、CNN三种不同的模型应用于时间序列预测方面的不同表现、各自的优缺点以及互相的结合方式。重点学习了GRU的原理,推导了其门控机制的实现方式。评估指标方面,新学习了一个用于水文模型的指标——Nash-Sutcliffe 效率系数(NSE)。