用户名
密码
(30天内有效)
注册
注册
首页 > 案例资料 >

如何用PyTorch构建多维时空交通数据的张量结构?

我要收藏
2020-08-25

【欢迎投稿】

如果你有与城市数据、城市创新、智慧城市、新技术等相关主题的稿件,欢迎来稿,稿费多多,请联系微信客服 lemon_udparty。

【本期看点】

随着人工智能与深度学习的快速发展,当下也出现了很多以Python语言为基础且性能表现优秀的数据处理与深度学习框架,其中,PyTorch以其灵活性和易用性吸引了大批人工智能领域科研人员以及从业者的注意,常被用于解决当代前沿研究问题。

本文将介绍如何使用PyTorch构建多维时空交通数据的张量结构,其中,实例中的交通数据集均为公开数据,能在最大程度上方便读者复现文中代码和结果。



  本期投稿  


1598346161883819.png


作者:kim

城市交通数据分析爱好者

目前从事城市综合交通规划类工作




PyTorch与科学计算



不可否认,在PyTorch进入人工智能从业者视野之前,Python中性能表现最佳的工具包无疑是Numpy,Numpy能够支持几乎所有的线性代数计算规则。然而,随着人们对机器学习算法的要求越来越高,综合硬件可用性、架构通用性等方面的考量,PyTorch作为一种新兴的机器学习架构而逐渐得到人们的喜爱。


 

从硬件可用性方面来说,仅仅以来CPU执行复杂的数学运算极其耗时且代价很大,能够在新型硬件(例如GPU,即图形处理单元)上搭建大规模的数学运算才能满足人们对计算的诉求。


从架构通用性来说,Numpy尽管对线性代数计算规则具有良好的适用性,但其覆盖面过于狭窄,难以适应诸如深度学习算法之类的运算,而传统的深度学习架构tensorflow又表现出入门门槛过高,即使对于很多人工智能从业者来说,灵活掌握和使用tensorflow也是颇有难度的事情。


PyTorch的出现无疑解决了这些问题,其易用性和简单性是它越来越受欢迎的原因。PyTorch通过GPU加速过的数学运算替代与Numpy类似的运算,同时,PyTorch在搭建复杂的深度学习架构具有很高的灵活性。


1598346191340309.png

PyTorch的GitHub开源界面,截止发稿,该项目已获得超过4万次标星 (star),注:图片截取自GitHub页面


 

注:在Python中安装PyTorch可以使用pip install torch语句。

 


什么是张量?


想要理解PyTorch的使用甚至将其用于多维时空数据挖掘任务中,我们可能需要先理解它的基本数据结构,如矩阵、张量。在Numpy中,这些基本数据结构通常都以数组 (array) 的形式出现,而PyTorch中则是张量 (tensor)。


 

张量是什么呢?简单来说,张量是由向量和矩阵延伸出来的多维结构,我们不妨来看一个例子:现有三名学生,分别叫小李、小张、小王,他们都参加了期中和期末的语文、数学和英语考试,现在为了把他们三人的成绩进行汇总,创建了下面这个表格。

1598346224181162.png

从这个成绩单中,我们可以看到,为了表示出各个成绩,我们会有三个维度的信息:考试阶段、学生姓名、学科。实际上,这个三维结构就是一个张量。


 

在Numpy中,我们可以把上述表格构造成这样的数组 (array):

 

1598346242400291.png

从图中可以看出,我们构造的grade就是一个数组,大小为2 x 3 x 3.


 

在PyTorch中,我们也可以把成绩单表格构造成这样的张量 (tensor):

 

1598346267924666.png

从图中可以看出,PyTorch构造张量的过程与Numpy是极为相似的,我们构造的grade是一个张量 (tensor),大小为2 x 3 x 3。需要注意的是,我们需要在最开始申明调用torch,紧接着,直接使用torch.FloatTensor即可构造张量。




下载多维时空交通数据集



为了加深读者对PyTorch在实际时空数据应用中的认识,接下来将以GitHub热门开源项目transdim(项目网址为https://github.com/xinychen/transdim,截止目前,该项目已获得超过350次标星)中所提供的时空交通数据为例,通过实例分析,以期让读者对张量有更深的认识。


 

开源项目transdim中的数据集 (datasets) 目录中提供了广州城市路网车速数据集、伯明翰停车数据集、杭州地铁客流数据集、西雅图高速公路车速数据集、纽约出租车流量数据集等,这些数据集支持各类数据建模以及交通数据修复及预测的标准测试。


1598346290497007.png

transdim项目的GitHub开源界面,注:图片截取自GitHub页面




使用PyTorch构造多维时空交通数据张量


【例1】以广州城市路网车速数据集为例 


按照如下步骤使用PyTorch构造多维时空交通数据张量:第一步,调用Python中基本的工具包,如这里的torch和scipy;第二步,使用scipy.io.loadmat命令导入.mat后缀的数据文件(这个文件.mat是Matlab数组,因此需要先通过scipy读入),并同时输出numpy数组;第三步,用PyTorch将numpy数组转换成torch中的张量。

1598346313262210.png

从图中可以看出,输出的张量大小为214 x 61 x 144,其中,214对应着214条路段,61对应着61天,而144则对应着每天的144个时间窗,时间窗粒度为10分钟,张量的元素表示车速。


 

【例2】以杭州地铁客流数据集为例 

按照如下步骤使用PyTorch构造多维时空交通数据张量:第一步,调用Python中基本的工具包,如这里的torch、numpy和scipy;第二步,使用scipy.io.loadmat命令导入.mat后缀的数据文件,并同时输出numpy数组;第三步,用PyTorch将numpy数组转换成torch中的张量,需要注意的是,这里的numpy数组需要转换成unit8格式。

1598346333824765.png


从图中可以看出,输出的张量大小为80 x 25 x 108,其中,80对应着80个地铁站,25对应着25天,而108则对应着每天早上6点到晚上24点的108个时间窗,时间窗粒度为10分钟,张量的元素表示地铁客流流量。


 

【例3】以纽约出租车流量数据集为例 

按照如下步骤使用PyTorch构造多维时空交通数据张量:第一步,调用Python中基本的工具包,如这里的torch、numpy和scipy;第二步,使用scipy.io.loadmat命令导入.mat后缀的数据文件,并同时输出numpy数组;第三步,用PyTorch将numpy数组转换成torch中的张量,需要注意的是,这里的numpy数组需要转换成unit8格式。

1598346353168598.png

从图中可以看出,输出的张量大小为30 x 30 x 1464,其中,30 x 30 对应出行的OD对,1464对应着61天、每天24个时间窗的时间点,时间粒度为1小时,张量的元素表示OD对间的出租车流量。




PyTorch时空数据张量的应用



数据能够组织成pytorch的张量格式,接下来可以用深度学习框架下的时空数据分析,例如异常检测、时空预测以及特征挖掘等。同时,PyTorch和python其他工具包可以无缝对接,在PyTorch中组织好的张量可直接在Python绘图工具中进行可视化。我们简单地准备了两个可视化的小例子供大家参考。



【例1】以广州城市路网车速数据张量为例 

图中红线表示广州城市路网车速数据集的车速曲线,其中选取了第1、2、3条路段,取两周作为时间跨度,进行绘制,从代码中可以看出,在PyTorch中组织好的张量可直接在Python绘图工具中进行可视化。


1598346380113231.png


【例2】以纽约出租车流量数据张量为例


热力图表示纽约市某天早上8点、9点、10点的出行流量,从例1和例2的代码及图形中可以看出,在PyTorch中组织好的时空数据张量可以运用Python绘图工具绘制各种各样的时空特征图形。


1598346403172268.png



总  结


本文介绍了PyTorch的一些基本组成部分,结合多个时空交通数据集,详细讨论了如何使用PyTorch构造时空数据张量,并应用构造好的张量基于Python绘图工具进行数据可视化操作。




本站声明

本文仅代表作者观点,不代表城市数据派立场;
本文系作者授权城市数据派发表,未经许可,不得转载;
本网站上的所有内容均为虚拟服务,一经购买成功概不退款,请您理解。

点赞0