基于车辆轨迹时空数据的城市热点预测模型研究

发布于:2022-12-07 ⋅ 阅读:(691) ⋅ 点赞:(0)

目 录

摘 要 I
Abstract III
插图清单 IX
附表清单 XI
1引 言 1
1.1研究背景及意义 1
1.2研究内容与方法 2
1.3本文组织内容 2
2文献综述 4
2.1交通预测概述 4
2.2核密度估计概述 5
2.3交通预测中的机器学习方法 5
2.3.1传统交通预测方法 5
2.3.2基于机器学习的预测方法 6
3基于核密度估计算法的城市车流密度提取模型 8
3.1车辆轨迹时空数据概述 8
3.1.1GPS 数据描述 8
3.1.2Open Street Map 10
3.1.3研究区域概述 10
3.2车辆轨迹时空数据预处理 11
3.3基于时空轨迹数据的核密度估计算法 12
3.3.1核密度估计算法 12
3.3.2核密度估计最适带宽计算 13
3.4北京市出租车热点信息提取 14
3.4.1实验环境 14
3.4.2时空数据密度挖掘 15
3.4.3模型参数设置 17
3.4.4实验结果与分析 17
3.5本章小结 22
4基于支持向量回归的热点预测模型 23
4.1基于滑动窗口的热点信息数据处理 23
4.1.1滑动窗口模型 23

  • V -
    4.1.2训练数据集构造 24
    4.1.3数据的归一化处理 26
    4.2支持向量回归预测 27
    4.2.1支持向量回归 27
    4.2.2支持向量回归参数 30
    4.3支持向量回归热点预测 31
    4.3.1实验环境 31
    4.3.2模型参数设置 31
    4.3.3预测评价标准 32
    4.3.4实验结果与分析 33
    4.4本章小结 39
    5基于神经网络的热点预测模型 40
    5.1神经网络概述 40
    5.1.1神经网络构成 40
    5.1.2损失函数与正则化 42
    5.1.3前向传播与反向传播 43
    5.1.4激活函数 44
    5.2优化方法 46
    5.3循环神经网络 47
    5.4MLP 热点预测 50
    5.4.1实验环境 50
    5.4.2模型参数设置及评价标准 50
    5.4.3实验结果与分析 51
    5.5LSTM 热点预测 56
    5.5.1实验环境 56
    5.5.2参数设置 56
    5.5.3实验结果与分析 57
    5.6本章小结 60
    6不同时间尺度下模型性能分析 61
    6.1不同时间尺度预测模型 61
    6.1.1短时预测模型 61
    6.1.2长时预测模型 61
    6.2不同时间尺度预测模型性能对比 62
    6.2.1实验参数设置 62
    6.2.2模型对比与分析 62
    6.3本章小结 63
    7结论与展望 64
    参考文献 67
    在学取得成果 73
    致 谢 75

6不同时间尺度下模型性能分析
本章主要研究思路:从一个新的视角观察预测效果,前述的实验主要从某一时刻采样时间点或采样地点的角度去观察模型的效果,本章分析不同时间尺度下各种预测模型的性能体现。
6.1不同时间尺度预测模型
6.1.1短时预测模型
时间序列数据预测采用的是滑动窗口的方法,如前所述,通过将数据集分为训练集和测试集,在使用测试集验证时,属于短时预测模型,即输入的数据是数据集已知的,实际预测的数据是输入数据的下一时间点的预测,即模型训练好后,必须输入预测时间点前窗口步长长度的历史数据,上述预测采用的均为短时预测,也称为实时预测,需要不断向模型输入数据,这样预测未来不同时间尺度上车流密度的精度跟时间尺度的关联性必然不会很强, 更多的取决于训练出的模型的性能和输入的窗口数据。为此,提出长时预测模型的概念,为大尺度时间下预测提供一种方式。
6.1.2长时预测模型

短时预测能够充分体现模型通过喂入数据展现出的优越性能,长时预测则需要模型具有很强的预知能力,以及预测偏差后的纠正能力。长时预测即需要利用训练集训练出的模型来不停预测下一时刻的预测值,然后将预测值作为下一时刻预测的输入数据,即后续的预测数据都取决于已预测出来的历史数据,这样就不需要像实时预测那样不停的喂入历史数据。长时预测和短时预测的对比如图 6-1 所示。
本小节对长时预测模型的概念进行解释,从原理上来看,长时预测通过预测出的数据作为下一次预测的输入数据,每次预测会产生一定的预测偏差, 导致下一次输入数据与真实数据产生细微偏差,不断累积,随着时间尺度增加,预测的误差也会累积,导致时间尺度过大时预测误差较大。长时间的预测会导致预测失效的现象。而针对这一问题可以提出两个解决办法:(1)通过增加数据集时间线长度,本文转载自http://www.biyezuopin.vip/onews.asp?id=14875将一天的数据扩充到一周甚至一个月,然后相应增加输入数据采样时间点的间隔,本文数据采用 100 秒的间隔,可以通过增加采样间隔,将长时预测转化为预测精准的短时预测,但是要求原始数据的时间线足够长;(2)通过一些非线性的方法,实现模型对长时间跨度预测的优化,克服或减小误差累计的影响。

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.layers import Dropout, Dense, LSTM
from sklearn import preprocessing
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score
from sklearn.metrics import explained_variance_score
from sklearn.metrics import mean_absolute_error


# 加载数据
data = np.load('./TrainData/all_point_data_3.npz')

# 所有数据aa
# 维度说明:采样点个数*时间序列数*(Link_Num+1)
Data_ALL = data['all_point_data']
# print(Data_ALL.shape)

# 采样点个数
Point_Num = len(Data_ALL[:])
# 时间序列长度
Time_Num = len(Data_ALL[0, :])

# ----------------每次运行前注意预测长度是否修改-------------------------
def Get_LinkNum():
    return 3

# 训练集测试集分类
Split = 700

# 评价指标数组,包含每个Point的预测指标
MAE_ALL = []
MSE_ALL = []
R2_ALL = []

Data_ALL_Trans = Data_ALL.copy()
Data_ALL_Test = Data_ALL.copy()

for point in range(Point_Num):
    # 进度
    print(point, '/9999')

    # 对每个采样点进行归一化处理
    # MinMaxScaler():
    # X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    # X_scaled = X_std * (max - min) + min
    min_max_scaler = preprocessing.MinMaxScaler()
    # for i in range(0, Point_Num):
    Data_ALL_Trans[point, :, :] = min_max_scaler.fit_transform(Data_ALL[point, :, :])


    X_data = Data_ALL_Trans[:, :, :Get_LinkNum()]
    Y_data = Data_ALL_Trans[:, :, Get_LinkNum()]
    # print(X_data.shape, Y_data.shape)

    X_train_data = X_data[point, :Split, :]
    X_train_data = np.expand_dims(X_train_data, 2)
    Y_train_data = Y_data[point, :Split]
    X_test_data = X_data[point, Split:, :]
    X_test_data = np.expand_dims(X_test_data, 2)
    Y_test_data = Y_data[point, Split:]

    print(X_train_data.shape, Y_train_data.shape)

    # 建立LSTM模型
    tf.random.set_seed(1)

    model = tf.keras.Sequential([
        # LSTM(100, return_sequences=True),
        # Dropout(0.1),
        LSTM(100),
        Dropout(0.1),
        Dense(1)
    ])

    model.compile(optimizer=tf.keras.optimizers.Adam(0.001), loss='mean_squared_error')  # 损失函数用均方误差

    clf = model.fit(X_train_data, Y_train_data, batch_size=64, epochs=50, validation_data=(X_test_data, Y_test_data),
                    validation_freq=1)

    # model.summary()

    y_train_hat = model.predict(X_train_data)
    y_test_hat = model.predict(X_test_data)
    print(y_test_hat.shape)
    # score = clf.score(X_test_data, Y_test_data)
    # print("score:", score)

    X_test_data = np.squeeze(X_test_data)
    X_train_data = np.squeeze(X_train_data)
    print(X_test_data.shape)

    # 归一化还原
    test_data_trans = np.c_[X_test_data, y_test_hat]
    train_data_trans = np.c_[X_train_data, y_train_hat]
    data_all_trans = np.concatenate((train_data_trans, test_data_trans))

    # 数据还原
    data_all = min_max_scaler.inverse_transform(data_all_trans)
    # print(data_all.shape, data_all)

    y_raw = Data_ALL[point, :, Get_LinkNum()]
    y_train_raw = Data_ALL[point, :len(X_train_data), Get_LinkNum()]
    y_test_raw = Data_ALL[point, len(X_train_data):, Get_LinkNum()]

    y_train_hat = data_all[:len(X_train_data), Get_LinkNum()]
    y_test_hat = data_all[len(X_train_data):, Get_LinkNum()]

    # 评价指标
    # 训练集
    # Mean squared error(均方误差)
    MSE_Train = mean_squared_error(y_train_hat, y_train_raw)

    # Mean absolute error(平均绝对误差),给定数据点的平均绝对误差,一般来说取值越小,模型的拟合效果就越好。
    MAE_Train = mean_absolute_error(y_train_hat, y_train_raw)

    # R2,R方可以理解为因变量y中的变异性能能够被估计的多元回归方程解释的比例,它衡量各个自变量对因变量变动的解释程度,其取值在01之间,其值越接近1
    # 则变量的解释程度就越高,其值越接近0,其解释程度就越弱。一般来说,增加自变量的个数,回归平方和会增加,残差平方和会减少,所以R方会增大;
    # 反之,减少自变量的个数,回归平方和减少,残差平方和增加。
    R2_Train = r2_score(y_train_hat, y_train_raw)
    # print("Train ERROR(MSE) = ", MSE_Train)
    # print("Train MAE = ", MAE_Train)
    # print("Train EVS = ", EVS_Train)
    # print("Train R2 = ", R2_Train)

    # 计算测试集
    MSE_Test = mean_squared_error(y_test_hat, y_test_raw)
    MAE_Test = mean_absolute_error(y_test_hat, y_test_raw)
    R2_Test = r2_score(y_test_hat, y_test_raw)
    # print("Test ERROR(MSE) = ", MSE_Test)
    # print("Test MAE = ", MAE_Test)
    # print("Test EVS = ", EVS_Test)
    # print("Test R2 = ", R2_Test)

    MSE_ALL = np.append(MSE_ALL, MSE_Test)
    MAE_ALL = np.append(MAE_ALL, MAE_Test)
    R2_ALL = np.append(R2_ALL, R2_Test)

# DataALLTest异常点处理,小于0的值按0计算
Data_ALL_Test[Data_ALL_Test < 0] = 0

# 异常值剔除
R2_ALL = [element for element in R2_ALL if element >= 0]

print("MAE:", np.mean(MAE_ALL))
print("MSE:", np.mean(MSE_ALL))
print("R2 Score:", np.mean(R2_ALL))

# 评价指标数据汇总
Sum_eva = np.array([[Get_LinkNum(),
                    np.mean(MSE_ALL), np.max(MSE_ALL), np.min(MSE_ALL),
                    np.mean(MAE_ALL), np.max(MAE_ALL), np.min(MAE_ALL),
                    np.mean(R2_ALL), np.max(R2_ALL), np.min(R2_ALL)]])

Sum_eva = pd.DataFrame(data=Sum_eva)
save_data_path = 'NNPredictData/LSTM_Sum_Params.csv'
Sum_eva.to_csv(save_data_path, index=False, mode='a', header=0)

save_name = './NNPredictData/all_y_hat_lstm_' + str(Get_LinkNum())
np.savez(save_name + '.npz', all_y_hat=Data_ALL_Test)










在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述