采用深度学习方法(LSTM)实现城市交通短期客流预测(附代码)

序言

    背景:随着城市的发展和人口的聚集,公共交通旅行问题变得越来越重要。城市交通由于其大容量、高速度和安全性等各种问题交错已成为目前所要研究的热门放心。近年来,城市交通发展迅速,但在追求大众“优质”出行的过程中,诸如交通拥堵、交通不便等问题亟待解决。基于预测的时间范围,客流预测可以大致分为三类:长期预测,中期预测和短期预测。中期和长期客流预测通常具有未来3到15年的预测范围,而短期客流预测通常具有下一周或一个月的预测范围。对城市客流的研究是城市交通规划、运营和安全防护的重要方面。短期客流预测可用于优化线路和客流组织,为运营商提供预警和多方决策,进一步提高城市的科学管理水平,对于安全和操作具有实际重要性。该预测可以为先进的客流控制和诱导方法提供证据,该方法可以防止拥塞,践踏和其他安全事故。因此,准确预测短期客流量具有重要意义。

      方法:递归神经网络(RNN)引入了序列的概念,这使它们能够更好地处理时间序列数据。RNN在自然语言处理(NLP)领域(例如机器翻译和语音识别)取得了显著成果。但是,由于RNN中的“梯度消失”问题,Hochreiter&Schmidhuber于1997年提出了一种改进的RNN网络,即长短期记忆(LSTM)神经网络,该网络为网络增加了“门”结构。 RNN网络结构可以使用“忘记门”和“输出门”来缓解消失的梯度问题,这可以使信息有选择地通过。与传统的RNN不同,LSTM神经网络非常适合从经验中学习,在所有的类似工作中显示LSTM神经网络适合于短时间客流预测。大家有好的方法可以去尝试,或者找我交流实现(Q525894654)。当然,在LSTM基础上进行改进或者采用线性模型同样可以做到很好的短期预测,但是本篇博客的目的就是为了复习和实现LSTM方法的简单应用。

代码实现

话不多说上代码

import numpy
import matplotlib.pyplot as plt
import pandas
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler

# 读取数据
dataframe = pandas.read_csv('passengers.csv', usecols=[1], engine='python', skipfooter=3)
dataset = dataframe.values
dataset = dataset.astype('float32')

numpy.random.seed(7)
def create_dataset(dataset, look_back=1):
  dataX, dataY = [], []
  for i in range(len(dataset)-look_back-1):
    a = dataset[i:(i+look_back), 0]
    dataX.append(a)
    dataY.append(dataset[i + look_back, 0])
  return numpy.array(dataX), numpy.array(dataY)

# 分割数据
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]

#设置数据输入形式
look_back = 1
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1]))

# LSTM
model = Sequential()
model.add(LSTM(4, input_dim=look_back))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, nb_epoch=50, batch_size=1, verbose=2)

# 预测
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)

scaler = MinMaxScaler(feature_range=(0,1))
dataset = scaler.fit_transform(dataset)
# invert predictions
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])
trainScore = math.sqrt(mean_squared_error(trainY[0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(testY[0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))
trainPredictPlot = numpy.empty_like(dataset)
trainPredictPlot[:, :] = numpy.nan
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict# shift train predictions for plotting
trainPredictPlot = numpy.empty_like(dataset)
trainPredictPlot[:, :] = numpy.nan
trainPredictPlot[look_back:len(trainPredict)+look_back, :] = trainPredict
#画图
testPredictPlot = numpy.empty_like(dataset)
testPredictPlot[:, :] = numpy.nan
testPredictPlot[len(trainPredict)+(look_back*2)+1:len(dataset)-1, :] = testPredict

plt.plot(scaler.inverse_transform(dataset))
plt.plot(trainPredictPlot)
plt.plot(testPredictPlot)
plt.show()

数据为网上随便爬取的某地铁5个月人流量统计;其预测结果如图所示:蓝色为真实值,黄色为训练值,绿色为预测值,可能训练次数太少,所以其训练的预测值并不是很好,拟合程度不高,其测试集RMSE为2.56,还是比较大的,也可能获取的数据有中断导致。

发布了38 篇原创文章 · 获赞 192 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/weixin_40651515/article/details/104603561