JobPlus知识库 IT 工业智能4.0 文章
基于支持向量回归和LSTM的短时交通流预测

1.1 前言

在深度学习火之前,学术界更多是采用机器学习的方法,而其中支持向量机就是最热门一个方法,这篇文档基于支持向量回归和LSTM两种模型进行短时交通流预测。

本文所采用的数据是2016年10月长沙市芙蓉路/人民路北向南方向的交通流数据,数据采用5min内通过数据采集点的车辆数的统计值,10月15日和16日共576个数据点,其中15日为星期六,16日为星期天,两天都为周末,所以两天在时间上应该有同样的分布。

1.2 训练、测试数据集

本文以10月15日288个数据点作为训练样本集,10月16日的288个作为测试集。参考前人的研究,文中将当前t时间的流量和前4个时间段共5个点的流量作为输入值,以t+1时刻的流量为输出,所以网络输入和输出的属性个数分别为5,1(个数可根据实际情况定)。于是训练集输入为283*5,输出为283*1,283为样本个数;测试集是一样。

1.3 数据预处理

LSTM做预测的时候,输入数据通常都是要归一化处理的,原因:1、避免不同数量级的特征对网络鲁棒性的影响;2、支持向量机好像是建立在数据集是正态分布的前提下的,所以,如果数据集不满足正态分布,对结果有很大影响。本文中采用了两种方案进行数据预处理。

1)Min-Max scaling

大多数机器学习算法中,会选择Standardization来进行特征缩放,但是,Min-Max Scaling也并非会被弃置一地。在数字图像处理中,像素强度通常就会被量化到[0,1]区间,在一般的神经网络算法中,也会要求特征被量化[0,1]区间。公式如下:


2)Standardization

量化后的特征将服从标准正态分布,因为很多算法的假设都是建立在数据集是正态分布的基础上的,如支持向量机,其具体公式如下:

其中,u和delta分别为对应特征的均值和标准差。这样数据的均值为0,标准差为1。

预测出来的序列需要反归一化,才能得到真实的交通流量。

1.4 模型结构

本文采用ε-支持向量回归,采用rbf核函数,C为0.8,gamma为0.2,epsilon为0.1。

LSTM模型输入特征数为5,输出特征数为7,网络层数为2,所以整个网络为5-7-7,然后在LSTM模型后加一个全连接层,全连接的输入为7,输出为1。

因为训练的样本数比较少,所以设计的LSTM的模型也比较简单。

1.5 评价指标

本文采用均方根误差(Root Mean Square Error)是观测值与真值偏差的平方和与观测次数m比值的平方根,是用来衡量观测值同真值之间的偏差。计算公式为:

1.6 结果分析

1)支持向量机

2)LSTM-layer=2

3)LSTM-layer=6

红色为真实值,黑色为预测值,绿色为误差。

上图中(c)、(d)为LSTM中层数为2层的结果,(e)、(f)为层数为6层的结果。可以发现LSTM整体更平滑,把握一种整体趋势,而且随着参数和网络层数的增加,网络的输出越平滑。(不知道增加训练样本集的数据量是不是会不一样)。对,不同的网络模型计算的评价指标如下表所示。


部分程序: 

 

[python] 

  1. #!/usr/bin/env python  
  2. # -*- coding: utf-8 -*-  
  3. # @Author  : Yibao2hao  
  4.   
  5. """ 
  6. 可代写程序,有问题可加qq:778961303. 
  7. """  
  8.   
  9. # 导入相关模块  
  10. import numpy as np  
  11. import pandas as pd  
  12. from sklearn.svm import SVR  
  13. import matplotlib.pyplot as plt  
  14. from pylab import mpl  
  15. import pickle  
  16. from sklearn import metrics  
  17.   
  18. mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体/matplotlib显示汉字  
  19.   
  20. ##-----------------------------------------------------------  
  21. # 训练数据  
  22. with open('standardtrain.pkl', 'rb') as f:  # Python 3: open(..., 'rb')  
  23.     trainx, trainy = pickle.load(f)  
  24.   
  25. ##-----------------------------------------------------------  
  26. # 测试数据  
  27. with open('standardtest.pkl', 'rb') as f1:  # Python 3: open(..., 'rb')  
  28.     testx, testy, scale = pickle.load(f1)  
  29.   
  30. # #############################################################################  
  31. # Fit regression model  
  32.   
  33. svr_rbf = SVR(kernel='rbf', C=0.8, gamma=0.2)  
  34. svr_lin = SVR(kernel='linear', C=1e3)  
  35. svr_poly = SVR(kernel='poly', C=1e3, degree=2)  
  36. svr_rbf.fit(trainx, trainy)  
  37. y_rbf = svr_rbf.predict(testx)  
  38.   
  39. # Look at the results  
  40. lw = 2  
  41. x1 = np.arange(testy.size)  
  42. plt.plot(x1, testy, 'r.-',lw=lw, label='训练值')  
  43. plt.plot(x1, y_rbf, 'k.-', lw=lw, label='测试值')  
  44. plt.xlabel('data')  
  45. plt.ylabel('target')  
  46. plt.title('Support Vector Regression')  
  47. plt.legend()  
  48. plt.show()  
  49.   
  50. # #############################################################################  
  51. # 显示拟合的误差  
  52. fig = plt.figure()  
  53. error_rbf = testy - y_rbf  
  54. error_rbf = np.squeeze(error_rbf)  
  55. plt.plot(x1, error_rbf, 'g.-', lw=lw, label='RBF model error')  
  56. plt.xlabel('data')  
  57. plt.ylabel('error')  
  58. plt.title('The fitting error of each model')  
  59. plt.legend()  
  60. plt.show()  
  61. 交通流预测 LSTM SVR 支持向量机 机器学习  
  62. # 输出模型的RMSE误差  
  63. print(np.sqrt(metrics.mean_squared_error(testy, y_rbf)))  



如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
369人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序