

【欢迎投稿】
如果你有与城市数据、城市创新、智慧城市、新技术等相关主题的稿件,欢迎来稿,稿费多多,请联系微信客服 lemon_udparty。
【本期看点】
随着人工智能与深度学习的快速发展,当下也出现了很多以Python语言为基础且性能表现优秀的数据处理与深度学习框架,其中,PyTorch以其灵活性和易用性吸引了大批人工智能领域科研人员以及从业者的注意,常被用于解决当代前沿研究问题。
本文将介绍如何使用PyTorch构建多维时空交通数据的张量结构,其中,实例中的交通数据集均为公开数据,能在最大程度上方便读者复现文中代码和结果。
不可否认,在PyTorch进入人工智能从业者视野之前,Python中性能表现最佳的工具包无疑是Numpy,Numpy能够支持几乎所有的线性代数计算规则。然而,随着人们对机器学习算法的要求越来越高,综合硬件可用性、架构通用性等方面的考量,PyTorch作为一种新兴的机器学习架构而逐渐得到人们的喜爱。
从硬件可用性方面来说,仅仅以来CPU执行复杂的数学运算极其耗时且代价很大,能够在新型硬件(例如GPU,即图形处理单元)上搭建大规模的数学运算才能满足人们对计算的诉求。
从架构通用性来说,Numpy尽管对线性代数计算规则具有良好的适用性,但其覆盖面过于狭窄,难以适应诸如深度学习算法之类的运算,而传统的深度学习架构tensorflow又表现出入门门槛过高,即使对于很多人工智能从业者来说,灵活掌握和使用tensorflow也是颇有难度的事情。
PyTorch的出现无疑解决了这些问题,其易用性和简单性是它越来越受欢迎的原因。PyTorch通过GPU加速过的数学运算替代与Numpy类似的运算,同时,PyTorch在搭建复杂的深度学习架构具有很高的灵活性。
PyTorch的GitHub开源界面,截止发稿,该项目已获得超过4万次标星 (star),注:图片截取自GitHub页面
注:在Python中安装PyTorch可以使用pip install torch语句。
想要理解PyTorch的使用甚至将其用于多维时空数据挖掘任务中,我们可能需要先理解它的基本数据结构,如矩阵、张量。在Numpy中,这些基本数据结构通常都以数组 (array) 的形式出现,而PyTorch中则是张量 (tensor)。
张量是什么呢?简单来说,张量是由向量和矩阵延伸出来的多维结构,我们不妨来看一个例子:现有三名学生,分别叫小李、小张、小王,他们都参加了期中和期末的语文、数学和英语考试,现在为了把他们三人的成绩进行汇总,创建了下面这个表格。
从这个成绩单中,我们可以看到,为了表示出各个成绩,我们会有三个维度的信息:考试阶段、学生姓名、学科。实际上,这个三维结构就是一个张量。
在Numpy中,我们可以把上述表格构造成这样的数组 (array):
从图中可以看出,我们构造的grade就是一个数组,大小为2 x 3 x 3.
在PyTorch中,我们也可以把成绩单表格构造成这样的张量 (tensor):
从图中可以看出,PyTorch构造张量的过程与Numpy是极为相似的,我们构造的grade是一个张量 (tensor),大小为2 x 3 x 3。需要注意的是,我们需要在最开始申明调用torch,紧接着,直接使用torch.FloatTensor即可构造张量。
为了加深读者对PyTorch在实际时空数据应用中的认识,接下来将以GitHub热门开源项目transdim(项目网址为https://github.com/xinychen/transdim,截止目前,该项目已获得超过350次标星)中所提供的时空交通数据为例,通过实例分析,以期让读者对张量有更深的认识。
开源项目transdim中的数据集 (datasets) 目录中提供了广州城市路网车速数据集、伯明翰停车数据集、杭州地铁客流数据集、西雅图高速公路车速数据集、纽约出租车流量数据集等,这些数据集支持各类数据建模以及交通数据修复及预测的标准测试。
transdim项目的GitHub开源界面,注:图片截取自GitHub页面
关注城市数据派微信号,在微信号中输入“ 825数据和代码 ”,即可获得本文中的完整代码及广州城市路网车速数据集、伯明翰停车数据集、杭州地铁客流数据集、西雅图高速公路车速数据集、纽约出租车流量数据集的下载地址。
按照如下步骤使用PyTorch构造多维时空交通数据张量:第一步,调用Python中基本的工具包,如这里的torch和scipy;第二步,使用scipy.io.loadmat命令导入.mat后缀的数据文件(这个文件.mat是Matlab数组,因此需要先通过scipy读入),并同时输出numpy数组;第三步,用PyTorch将numpy数组转换成torch中的张量。
从图中可以看出,输出的张量大小为214 x 61 x 144,其中,214对应着214条路段,61对应着61天,而144则对应着每天的144个时间窗,时间窗粒度为10分钟,张量的元素表示车速。
按照如下步骤使用PyTorch构造多维时空交通数据张量:第一步,调用Python中基本的工具包,如这里的torch、numpy和scipy;第二步,使用scipy.io.loadmat命令导入.mat后缀的数据文件,并同时输出numpy数组;第三步,用PyTorch将numpy数组转换成torch中的张量,需要注意的是,这里的numpy数组需要转换成unit8格式。
从图中可以看出,输出的张量大小为80 x 25 x 108,其中,80对应着80个地铁站,25对应着25天,而108则对应着每天早上6点到晚上24点的108个时间窗,时间窗粒度为10分钟,张量的元素表示地铁客流流量。
按照如下步骤使用PyTorch构造多维时空交通数据张量:第一步,调用Python中基本的工具包,如这里的torch、numpy和scipy;第二步,使用scipy.io.loadmat命令导入.mat后缀的数据文件,并同时输出numpy数组;第三步,用PyTorch将numpy数组转换成torch中的张量,需要注意的是,这里的numpy数组需要转换成unit8格式。
从图中可以看出,输出的张量大小为30 x 30 x 1464,其中,30 x 30 对应出行的OD对,1464对应着61天、每天24个时间窗的时间点,时间粒度为1小时,张量的元素表示OD对间的出租车流量。
数据能够组织成pytorch的张量格式,接下来可以用深度学习框架下的时空数据分析,例如异常检测、时空预测以及特征挖掘等。同时,PyTorch和python其他工具包可以无缝对接,在PyTorch中组织好的张量可直接在Python绘图工具中进行可视化。我们简单地准备了两个可视化的小例子供大家参考。
图中红线表示广州城市路网车速数据集的车速曲线,其中选取了第1、2、3条路段,取两周作为时间跨度,进行绘制,从代码中可以看出,在PyTorch中组织好的张量可直接在Python绘图工具中进行可视化。
热力图表示纽约市某天早上8点、9点、10点的出行流量,从例1和例2的代码及图形中可以看出,在PyTorch中组织好的时空数据张量可以运用Python绘图工具绘制各种各样的时空特征图形。
本文介绍了PyTorch的一些基本组成部分,结合多个时空交通数据集,详细讨论了如何使用PyTorch构造时空数据张量,并应用构造好的张量基于Python绘图工具进行数据可视化操作。
关注城市数据派微信号,在微信号中输入“ 825数据和代码 ”,即可获得本文中的完整代码及广州城市路网车速数据集、伯明翰停车数据集、杭州地铁客流数据集、西雅图高速公路车速数据集、纽约出租车流量数据集的下载地址。
最近有朋友问我们:为什么没有及时看到推文?因为微信改了推送规则,没有点“赞”或“在看”,没有把我们“星标”,都有可能出现这种状况。
加“星标”,不迷路!看完文章顺手点点“赞”或“在看”,就可以准时与我们见面了~


原文始发于微信公众号(城市数据派):如何用PyTorch构建多维时空交通数据的张量结构?丨城市数据派