前言

这是我的本科毕业设计,没有用这些大佬们发布的数据集,第一是因为老师会说没有工作量,第二是他们的数据集都是预处理好了,比如PeMSD7如果要更其它的模型比较就没办法像ASTGCN、STSGCN、STFGNN模型要求输入的空间序列一样,具体的问题我会等我拿到了毕业证再阐述。

实验过程

环境配置

都采用conda来配置虚拟环境。

STGCN的环境配置

代码库地址:https://github.com/VeritasYin/STGCN_IJCAI-18

更新最新的地址:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/
conda config --add channels https://mirror.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
conda config --add channels https://mirror.tuna.tsinghua.edu.cn/anaconda/pkgs/r
conda config --add channels http://mirrors.aliyun.com/pypi/simple/

创建新的虚拟环境:

conda create -n py36ts19 python=3.6

激活环境:

conda activate py36ts19

安装tensorflow:

pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow==1.9 pip==21.3.1
pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu==1.9 pip==21.3.1

安装NumPy:

pip install -U numpy==1.15 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装SciPy:

pip install -U scipy==1.1.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装Pandas:

pip install -U pandas==0.23 -i https://pypi.tuna.tsinghua.edu.cn/simple

克隆项目:

git clone https://github.com/VeritasYin/STGCN_IJCAI-18.git

安装cuda和cudnn:

conda install cudatoolkit=9.0
conda install cudnn=7

退出环境:

conda deactivate

ASTGCN、STSGCN和STFGNN的环境配置

代码库地址:
ASTGCN:https://github.com/Davidham3/ASTGCN

STSGCN:https://github.com/Davidham3/STSGCN

STFGNN:https://github.com/MengzhangLI/STFGNN

他们都推荐用docker,但是docker-gup只能在Liunx环境上安装,所以我没有用docker来快速安装,还是用conda:

conda create -n  mxnet_envs python=3.6
conda remove -n mxnet_envs --all
conda activate mxnet_envs
conda install cudatoolkit=10.0.130
conda install cudnn=7.3.1
pip install mxnet-cu100 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install -U pytest
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple graphviz==0.8.4
conda deactivate

数据集

数据集的收集

到这个网址https://pems.dot.ca.gov/?dnode=Clearinghouse上注册登录(注意只能使用国外邮箱哦。)

时间序列,选择Station 5-Minute、District X,下面就会有01年到22年的每个月每日的交通流量数据:

空间位置数据,选择Station metadata,选择对应地区的对应月份就可以得到对应的传感器空间位置数据集:

此页面旁边也有对数据的描述:
对于时间序列的描述:

特征 描述
Timestamp 摘要间隔开始的日期和时间。例如,时间 08:00:00 表示聚合包含在 08:00:00 和 08:04:59 之间收集的度量值。请注意,对于五分钟的聚合,第二个值始终为 0。格式为 MM/DD/YYYY HH24:MI:SS。
Station 唯一的工作站标识符。使用此值可与元数据文件交叉引用。
District#
Freeway# 高速公路
Direction of Travel 前往路线N \S \E \W
Lane Type 指示车道类型的字符串。可能的值(及其含义为:CD (Coll/Dist);CH(常规公路);FF (Fwy-Fwy 连接器);FR(下坡道);高压(HOV);ML (主线);OR(斜坡上)
Station Length 车站覆盖的航段长度(以英里/公里为单位)。
Samples 所有车道收到的样本总数。
% Observed 在此位置观察到的单个车道点的百分比(例如,not imputed)。
Total Flow 5 分钟内所有车道的流量总和。请注意,基本的 5 分钟汇总会根据从控制器接收到的良好样本数对流程进行标准化。Veh/5-min
Avg Occupancy 5 分钟内所有车道的平均占用率以介于 0 和 1 之间的十进制数表示。%
Avg Speed 所有车道上 5 分钟内的流量加权平均速度。如果流量为 0,则为 5 分钟工位速度的数学平均值。Mph
Lane N Samples N通道收到的合格样品数(范围从 1 到该位置的通道数)
Lane N Flow 通道N在 5 分钟内的总流量由良好样品的数量归一化Veh/5-min
Lane N Avg Occ 车道N的平均占用率表示为介于 0 和 1 之间的十进制数。(N的范围从 1 到该位置的车道数)%
Lane N Avg Speed 车道 N 速度的流量加权平均值。如果流量为 0,则为 5 分钟车道速度的数学平均值。N 范围从 1 到车道数Mph
Lane N Observed 1 表示观测到的数据,0 表示插补的数据。

对于空间序列的描述:

特征 描述
ID 一个整数值,用于唯一缩进工作站元数据。使用此值可以"加入"包含电台元数据的其他信息交换所文件
Freeway 高速公路号码
Freeway Direction 指示高速公路方向的字符串
County Identifie 标识 PeMS 中包含此站的唯一编号。
City 城市
State Postmile 国家里程
Absolute Postmile 绝对里程
Latitude 经度
Longitude 纬度
Length 长度
Type 类型
Lanes 车道总数
Name 名字
User IDs[1-4] 用户输入的字符串标识符

数据集的预处理

数据集的预处理的整体思路就是:

时间序列和空间序列要保留的特征加粗了:

Station 5-Minute:Timestamp、Station、District#、Freeway#、Direction of Travel、Lane Type、Station Length、Samples、% Observed、Total Flow、Avg Occupancy、Avg Speed、Lane N Samples、Lane N Flow、Lane N Avg Occ、Lane N Avg Speed、Lane N Observed
Station metadata:IDFreeway、Freeway Direction、County Identifie、City、State Postmile、Absolute Postmile、Latitude、Longitude、Length、Type、Lanes、Name、User IDs[1-4]
STGCN只用了一个特征值speed,ASTGCN、STSGCN和STFGNN的特征向量是flow、occupancy和speed。所以评价指标的大小会有差异哦。

import csv
from os import listdir
import pandas as pd
import numpy as np
from geopy.distance import geodesic# 站点数
num_station = 50
# 天数
num_days = 31# 读取文件夹下单文件
# 目录列表
dir = '下载的数据集存放的文件夹'
# 打开结果文件
# 目录中所有的文件
for filename in listdir(dir):# 找到csv文件if filename.endswith('.csv'):# 读取csv文件data = pd.read_csv(下载的数据集存放的文件夹' + filename, header=None)# 提取传感器编号列,第2列data_station = data.iloc[:, 1]station_nums = np.array(data_station)after_enumerate = enumerate(station_nums)li = []# 如果不是前50个传感器,则数据被删除for station_index, station_num in after_enumerate:if station_index % 10 == 0:print(station_index, station_num)if station_num > 715974:  # 50li.append(station_index)data_new = data.drop(labels=li, axis=0).loc[:, [0, 1, 9, 10, 11]]data_new.to_csv('aggregation.csv', mode='a', index=None, header=None)print(filename + ' is done!')# 时间序列变换
# 采用线性插值法填补缺失值填充缺失值
datas = pd.read_csv('aggregation.csv', header=None)
datas = datas.interpolate(method='values')
# 保存为stgcn的数据格式
v_value = np.zeros((288 * num_days, num_station))
# 保存为astgcn的数据格式
fos = np.zeros((288 * num_days, num_station, 3))
for i in range(0, 288 * num_days):  # 一天24小时,5分钟一次,num_days天的数据for j in range(0, num_station):v_value[i][j] = datas.loc[i * num_station + j, 2] # flowfos[i][j][0] = datas.loc[i * num_station + j, 2] # flowfos[i][j][1] = datas.loc[i * num_station + j, 3] # occupyfos[i][j][2] = datas.loc[i * num_station + j, 4] # speed
# 保存
new_data_v = pd.DataFrame(v_value)
new_data_v.to_csv('PeMSD7_V_50.csv', index=None, header=None)
np.savez('PeMS22_07.npz', data=fos)
print('时间序列片变换完毕!')# 空间信息
# 不能解决txt中对应列有空值的问题
txt_file = r"D:\BYSJ\pems77_07\d7_sation.txt"
csv_file = r"d07_meta_2022_03.csv"csvFile = open(csv_file, 'w', newline='', encoding='utf-8')
writer = csv.writer(csvFile)
csvRow = []f = open(txt_file, 'r', encoding='utf-8')
for line in f:csvRow = line.split()writer.writerow(csvRow)f.close()
csvFile.close()# 空间信息转换
data = pd.read_csv('d07_meta_2022_03.csv')
# 读取编号
sid = data.iloc[:, 0]
# 读取公路
fwy = data.iloc[:, 1]
# 读取绝对里程
apm = data.iloc[:, 7]
# 读取维度
lat = data.iloc[:, 8]
# 读取经度
lon = data.iloc[:, 9]
# 计算节点权重
datas = np.zeros((num_station, num_station))  # 创建num_station*num_station的数组
for i in range(0, num_station):for j in range(0, num_station):datas[i][j] = geodesic((lat[i], lon[i]), (lat[j], lon[j])).m  # 以m为单位
weight_csv = pd.DataFrame(datas)
# 不保留列、行索引
weight_csv.to_csv('PeMSD7_W_50.csv', header=None, index=None)cost = np.zeros((num_station, num_station))
# 计算stsgcn用的距离矩阵
cost_arr = []
for i in range(0, num_station):for j in range(0, i):if i != j and fwy[i] == fwy[j]:cost[i][j] = abs(apm[i] - apm[j])for i in range(0, num_station):min_cost = 3000min_index = 0for j in range(0, num_station):if cost[i][j] != 0 and cost[i][j] < min_cost:min_index = jmin_cost = cost[i][j]if i != min_index and min_cost != 3000:cost_arr.append([i, min_index, min_cost * 1.6093])
dis_csv = pd.DataFrame(cost_arr, columns=['from', 'to', 'cost'])
dis_csv.to_csv('d07_distance.csv')
print('空间序列片变换完毕!')

我们把处理好的数据集放在这些文件夹下:



模型的训练

训练ASTGCN、STSGCN、STFGNN模型前要先写配置文件,比如ASTGCN模型的配置文件:

[Data]
adj_filename = data/PEMS2022/distance.csv
graph_signal_matrix_filename = data/PEMS2022/PEMS2022.npz
num_of_vertices = 150
points_per_hour = 12
num_for_predict = 12[Training]
model_name = ASTGCN
ctx = gpu-0
optimizer = adam
learning_rate = 0.001
epochs = 70
batch_size = 16
num_of_weeks = 1
num_of_days = 1
num_of_hours = 3
K = 3
merge = 0
prediction_filename = ASTGCN_prediction_2022
params_dir = experiment2

STGCN模型可以在main.py中修改默认配置,也可以在输入命令时传入配置:

STGCN:(py36ts19)python main.py --n_route 150 --graph  D:\BYSJ\minnconda\STGCN_IJCAI-18\dataset/PeMSD7_W_150.csv --epoch 70
ASTGCN:(mxnet_envs) python main.py --config configurations/PEMS2207.conf --force True
STSGCN:(mxnet_envs) python main.py --config config/PEMS2022/individual_GLU_mask_emb.json
STFGNN:(mxnet_envs) python main_4n0_3layer_12T_res.py --config config/PEMS2022/individual_3layer_12T.json

重复十次训练的代码:

import os, re
# execute command, and return the output
def execCmd(cmd):r = os.popen(cmd)text = r.read()r.close()return text
# wite "data" to file-filename
def writeFile(filename, data):f = open(filename, "a")f.write(data)f.close()
# 获取输出的内容
if __name__ == '__main__':for i in range(10):print(i)cmd = "python main.py"result = execCmd(cmd)filename = "存放输出的文件位置"writeFile(filename, result)

数据集

我自己收集处理两个数据集,分别命名为PeMS2022和PeMS22_07

戳这里下载哦。提取码:qbh6

STGCN、ASTGCN、STSGCN、STFGNN模型的对比实验操作步骤相关推荐

  1. 红外测试操作步骤_红外传感实验操作步骤及数据分析(无测试实图)

    红外传感实验操作步骤及数据分析(无测试实图) 1. 启动红外传感模块 红外传感模块工作实图 ( 1 ) 将 NEWlab 实验硬件平台通电并与电脑链接. ( 2 ) 将红外传感模块放置在 NEWlab ...

  2. 【评测】小鼠肝细胞系(GHA1、AML12、BNL CL.2)培养实验操作步骤

    小鼠正常肝细胞系作为一个生物医学领域常用的细胞实验模型,经常为广大科研工作者所接触.细胞的培养在实验中起到根基作用,如何争取的培养与使用,则是应用实操的关键.目前北京泽平提供小鼠肝细胞系有GHA1.A ...

  3. 【计算机图形学】实验:VB.net环境下的绘制贝赛尔(Bezier)自由曲线完整实验操作步骤

    一.实验目的 熟练掌握在.net环境下绘制贝赛尔自由曲线. 二.实验准备 学习生成贝赛尔自由曲线的基本算法,以及在.net环境下绘制贝赛尔自由曲线的基本方法(DrawBezier和DrawBezier ...

  4. 利用Erdas监督分类方法提取城镇用地信息完整实验操作步骤

    打开erdas,分波段加载landsat TM 影像信息,并转成img图像格式文件. 1.打开erdas,点击viewer打开新窗口,点击打开图标,选择要加载的一个波段的tif图像,点击OK. 2.点 ...

  5. oracle nbu异机恢复,通过NBU进行Oracle异机恢复的实验操作步骤

    本文描述的是使用VERITAS的NBU备份软件,将备份的Oracle数据库数据,恢复到另一台服务器上. 整个恢复过程的时间,与备份数据库的数据量大小相关.与恢复前的准备工作相关,包括如下几个过程: 这 ...

  6. [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. 计算机微程序设计实验报告,模型机综合实验及微程序设计实验报告.docx

    文档介绍: 模型机综合实验及微程序设计实验报告.docx成绩:实验报告课程名称:实践名称:姓名:专业:班级:学号:计算机组成原理模型机综合实验及微程序设计计算机科学与技术计算机科学与技术学院实验教学中 ...

  8. 推进中学理化生实验操作考场建设,培养学生的核心素养

    近年来,随着课程改革和新教材的使用给实验教学提出了新的要求,指出理化生实验是进行科学探究的重要方式,学生具备基本的实验技能是学习科学知识和进行探究活动的基础和保证.中学理化生实验操作考场建设,是物理. ...

  9. 基于TensorFlow和mnist数据集的手写数字识别系统 ,可识别电话号码,识别准确率高,有对比实验,两组模型,可讲解代码

    基于TensorFlow和mnist数据集的手写数字识别系统 ,可识别电话号码,识别准确率高,有对比实验,两组模型,可讲解代码

最新文章

  1. 【Kaidi安装问题】install_mkl.sh报错,没有数字签名
  2. 6.MATLAB变量——矩阵操作一
  3. 【Scratch】青少年蓝桥杯_每日一题_8.17_报数
  4. 必读干货 | 如何做好向上管理,分享我实践多年的完整方法论
  5. 仓库如何盘点 打印扫描一体PDA盘点机提升库存盘点效率
  6. 浏览器 刷新页面后回到顶部_JavaScript仿知乎回到顶部功能
  7. 是否可以限制蓝牙传输距离_技术文章—关于蓝牙传输范围的常见误解
  8. JAVA自学笔记08
  9. mysql查询很慢优化方法1
  10. Wirkshark表达式
  11. [USACO DEC13] 名称记录
  12. 移动视频直播点播方案
  13. 关于传奇自动触发的几个常用脚本OnKillMob、StdModeFunc、等触发事件
  14. cuda-gdb 调试 Program terminated with signal SIGKILL, Killed. The program no longer exists.
  15. java如何直接打印数组
  16. JS实现上一个、下一个、置顶、置底操作
  17. 宜家订单JSON_怎么评价宜家(IKEA)?
  18. Orbit Downloader 小巧无广告的下载工具,超赞的在线视频下载能力,比迅雷清爽多了!
  19. 红黑树特点以及如何构建红黑树
  20. 宸展光电拟与宸鸿科技集团合资;Tableau承诺未来五年培养1000万名数据学员 | 全球TMT...

热门文章

  1. 用 ffmpeg 压缩视频
  2. 如何通过IP访问MySQL数据库
  3. 操作系统——进程原理篇
  4. [PC] 2015 僵尸 ZOMBI
  5. Matlab/simulink、Saber及PSpice学习比较
  6. Manifest merger failed with multiple errors
  7. 彻底搞懂Lab 颜色空间
  8. 下血本买的!Android开发者出路在哪?先收藏了
  9. 树莓派bcm2836收集资料
  10. c语言洗牌发牌 无大小王 分四堆,C语言入门题