交通流预测爬坑记(二):最简单的LSTM预测交通流,使用tensorflow2实现

本文介绍了如何使用tensorflow2.0构建一个简单的LSTM模型预测交通流。作者强调tensorflow2.0的易用性,并分享了处理时间序列数据的难点,如按时间步长(time_step=5)划分数据。文中提供了数据来源,提到了数据预处理步骤,包括删除无关列和数据归一化。最后,概述了模型构建、训练、预测和评估的基本流程。

说到时间序列预测,我想一定首先想到RNN,然后想到LSTM,LSTM原理就不说了,网上有很多相关文章。

下面使用tensorflow2.0来实现预测

不得不说tensorflow2.0 太香了,太简单了,真的是有手就行

在tensorflow中只需要调用已经tensorflow的LSTM模块就行了,比如下面的代码

from tensorflow.keras.layers import Dense,LSTM,Dropout

model = tf.keras.Sequential([
    LSTM(80, return_sequences=True),
    Dropout(0.2),
    LSTM(80),
    Dropout(0.2),
    Dense(1)
])
model.compile(optimizer='adam',
             loss='mse',)

这样就创建了一个2层LSTM,每层80个神经元的;同时添加了Droopout函数防止过拟合;使用adam激活函数;使用mse作为损失误差的神经网络。真的炒鸡简单。
主要问题是数据的处理,要做时间序列预测,原理应该是使用前n个时间去预测下一个时间,也就是所模型训练的数据应该是下面这个图这样的数据在这里插入图片描述
所以处理数据才是困难的地方。

下面我使用的数据是在上一个文章中提到的英国站点数据。其他的数据也是大同小异。

百度网盘: https://pan.baidu.com/s/19vKN2eZZPbOg36YEWts4aQ
密码 4uh7

在导入数据时,不知道为什么如果有标红的这一列,就会提示错误,所以我把这个数据直接删了,这列数据对预测也没有影响
在这里插入图片描述
然后通过下面代码就可以得到一个包含,日期、流量的的数据

f = pd.read_csv('..\Desktop\AE86.csv')
# 从新设置列标
def set_columns():
    columns = []
    for i in f.loc[2]:
        columns.append(i.strip())
    return columns
f.columns = set_columns()
f.drop([0,1,2], inpl
好的,我会尽力编写一个通过GCN和LSTM进行交通流预测的模型,以下是代码实现: ```python import tensorflow as tf from tensorflow.keras import layers class GCNLSTMModel(tf.keras.Model): def __init__(self, num_nodes, num_features, num_timesteps, gcn_layer_sizes, lstm_layer_sizes, output_size): super(GCNLSTMModel, self).__init__() self.num_nodes = num_nodes self.num_features = num_features self.num_timesteps = num_timesteps self.gcn_layer_sizes = gcn_layer_sizes self.lstm_layer_sizes = lstm_layer_sizes self.output_size = output_size self.gcn_layers = [] for i in range(len(gcn_layer_sizes)): if i == 0: self.gcn_layers.append(layers.Dense(gcn_layer_sizes[i], activation='relu', input_shape=(num_nodes, num_features))) else: self.gcn_layers.append(layers.Dense(gcn_layer_sizes[i], activation='relu')) self.lstm_layers = [] for i in range(len(lstm_layer_sizes)): if i == 0: self.lstm_layers.append(layers.LSTM(lstm_layer_sizes[i], return_sequences=True, input_shape=(num_timesteps, sum(gcn_layer_sizes)))) else: self.lstm_layers.append(layers.LSTM(lstm_layer_sizes[i], return_sequences=True)) self.output_layer = layers.Dense(output_size) def call(self, inputs): x = inputs for layer in self.gcn_layers: x = layer(x) x = tf.transpose(x, [0, 2, 1]) x = tf.reshape(x, [-1, self.num_nodes * self.gcn_layer_sizes[-1]]) x = tf.reshape(x, [-1, self.num_timesteps, self.num_nodes * self.gcn_layer_sizes[-1]]) for layer in self.lstm_layers: x = layer(x) x = layers.Flatten()(x) x = self.output_layer(x) return x ``` 在上述代码中,我们首先定义了一个 `GCNLSTMModel` 类,该类包含了 GCN 层和 LSTM 层,以及输出层。其中,GCN 层用于图卷积操作,将邻接矩阵作为输入,输出节点特征表示;LSTM 层用于时间序列建模,将 GCN 层的输出作为输入,输出序列预测结果。 在 `call` 方法中,我们按照 GCN->LSTM->输出的顺序依次运行模型,最后得到预测结果。 需要注意的是,上述代码只是一个简单的示例,实际应用中还需要根据具体的数据情况进行调整和优化。同时,还需要对模型进行训练和调参,以达到更好的预测效果。
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值