一种基于Spark平台的短时交通流量预测方法与流程

文档序号:11866254阅读:501来源:国知局
一种基于Spark平台的短时交通流量预测方法与流程

本发明属于云计算和数据挖掘领域,具体涉及基于Spark平台的短时交通流量预测方法。



背景技术:

短时交通流量预测是指对特定路段未来几分钟的车流量做出预测。短时交通流量预测是解决城市交通拥堵的重要途径,而随着城市汽车数量的增加,交通流量的数据量急剧增加。单机进行基于位置数据的短时交通流量预测面临着数据量大存储困难、计算时间长等问题。而云计算平台在海量数据存储和大规模并行实时处理方面具有强大的技术优势,可以在保证预测精度的前提下,有效的提高短时交通流量预测的计算效率。

在众多分类算法中,KNN算法是一种最简单常用的算法,KNN算法预测精度很高,但由于在相似度计算过程中,每一个待分类的样本都要计算它到所有已知样本的距离,以确定它的K个最近邻点。随着数据量的增大,会造成相似度计算量过大、从而导致计算效率较低的问题,这样严重限制了KNN算法在数据挖掘工作中的应用。而在Spark平台上将KNN算法进行分布式实现,有效的解决了KNN算法近邻查找过程中搜索历史数据库效率过低的问题,提高了算法的计算效率,有效的改善了KNN预测算法的实用性。

Spark是一个通用的大规模数据快速处理引擎,它是由UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架。Spark是基于内存的迭代计算框架,它使用了RDD的理念,可以在内存中存储数据,只在需要时才持久化到磁盘中。这样做可以在很大程度上减少了数据处理过程中磁盘的读写,大幅度的降低了任务执行所需时间,因此Spark能更好的适用于数据挖掘和机器学习等需要反复迭代的算法。Spark还支持SQL查询、流式查询及图计算等。在分布式数据集计算时,Spark可以通过checkpoint机制来实现容错。

目前,国内的阿里巴巴、优酷土豆、百度、腾讯、网易、搜狐等互联网公司已经将Spark技术应用到了自己的商业生产系统中。百度拥有国内最大的Spark集群,已应用于凤巢、大搜索、直达号、百度大数据等业务中;阿里巴巴将Spark运用于淘宝的推荐相关算法上,同时还利用Spark图计算解决了许多实际生产问题。对于短时交通流量预测,随着交通数据量的成倍增加,传统的单机数据挖掘模式已经很难满足实际应用要求。将Spark大数据平台与短时交通流量预测相结合,可以使这一应用更加满足实际需要,同时对其他应用的研究也非常有借鉴价值。



技术实现要素:

本发明的目的在于提供一种基于Spark大数据平台的短时交通流量预测方法,在Spark集群上,对KNN算法进行并行化实现,通过并行化的对交通流量数据进行处理,加速数据处理过程,预测待测路段下一时刻的交通流量。

本发明的目的通过如下技术方案实现。

一种基于Spark平台的短时交通流量预测方法,包括以下步骤:

数据预处理:处理源交通流量数据,剔除与交通流量预测无关的数据字段。

基于时空关系的流量预测:利用与待测路段在时间和空间相关联路段的交通流量共同生成KNN算法的交通流特征向量。

实时流处理:利用Spark流计算解决了交通流量预测的实时性问题。

并行化KNN算法实现:对KNN算法进行并行化实现,使得KNN算法能够在分布式集群Spark上运行。

数据分析:利用并行化KNN算法,对基于时空关系生成的交通流特征向量进行处理,得到待测路段下一时刻交通流量的预测结果。

进一步地,数据预处理是对由道路传感器收集到的源交通流数据进行处理,得到与预测路段相关的字段数据以及与待测路段在时间和空间相关联路段的交通流数据,包括如下步骤:

将传感器收集到的交通流量数据存储到Hadoop的HDFS文件系统中。

利用textFile()函数将存储到HDFS文件系统中的交通流量数据读入到Spark中,并生成一个Spark中特有的数据类型MappedRDD。

利用map()函数,读取每一行交通流量数据,并利用Spark中的split()函数对每一行数据按照分隔符进行分割,最后将需要的交通流字段数据进行提取。

进一步地,基于时空关系的特征向量是对交通流数据进行时空特性分析,确定最佳的时间和空间维度,以此形成最佳的交通流输入向量,包括如下步骤:

确定最佳时间维度为2,即选取相关路段当前时刻和前一时刻的交通流量,时间间隔为5分钟

确定最佳空间维度为4,即选取待测路段、两个上游路段和一个下游路段的交通流量数据。

进一步地,实时流处理是利用Spark流计算时刻检测输入数据是否有更新,当数据有更新时,系统自动进行下一次的交通流量预测工作,以满足短时交通流量预测对于实时性的要求,包括如下步骤:

设置Spark Streaming的窗口时间为5分钟。

利用StreamingContext创建一个Spark Streaming Context对象。

利用socketTextStream()获得一个Dstream对象负责连接监听端口。

进一步地,并行化KNN算法实现是指对传统的基于单机运行的KNN算法重新进行实现,使并行化的KNN算法能够在由多台物理机组成的集群上运行,包括如下步骤:

利用mapPartitions()函数将已经处理好的交通流量数据分成几个分区,其中每个分区的数据在Spark集群中会在一个物理机上进行计算。

定义一个函数,这个函数的功能是获得待测路段及与待测路段在时间和空间相关联路段的交通流量所组成的特征向量。

将定义的这个函数作为mapPartitions()函数的参数。

数据分析是指在Spark集群上运行实现的并行化KNN算法,预测待测路段下一时刻的交通流量,包括如下步骤:

从历史数据库中利用欧式距离匹配到与当前待测路段交通流量最接近的K个交通流量数据。

取当前该K个交通流量向量的下一时刻交通流量的加权平均值作为预测路段下一时刻的交通流量。

与现有技术相比,本发明具有以下优点:

本发明通过数据预处理对原始数据的高维特征集进行了删减,除去了特征集中的冗余信息,减少了数据量。

本发明通过在Spark平台上对KNN算法进行并行化的实现,使KNN算法能够并行的进行特征向量相似度的计算工作,解决了KNN算法在相似度计算过程中计算效率较低的问题。

利用Spark强大的流处理功能,时刻检测输入数据的变化情况,当数据发生更新时系统能够自动的进行下一次的预测工作。因此可以满足短时交通流量预测对于实时性的要求。

将Spark平台与短时交通流量预测这一应用相结合,可以大幅度缩减进行交通流量的预测时间,使这一应用更加满足实际环境的要求。

附图说明

图1为本发明一种基于Spark平台的短时交通流量预测方法的流程图。

图2为数据预处理流程图。

图3为基于时空特性的交通流量预测示意图。

图4是基于时空特性与基于时间特性交通流量预测结果对比图。

图5为基于时空特性与基于时间特性MRE指标对比图。

图6为并行化KNN算法实现流程图。

图7为传统KNN算法与在Spark平台上并行化的KNN算法的预测时间对比图。

图8为在Spark平台上并行化的KNN算法扩展性示意图。

图9为在Spark平台上并行化的KNN算法加速比示意图。

具体实施方式

以下结合附图对本发明的具体实施作进一步说明,但本发明的实施和保护不限于此,需指出的是,以下若有未特别详细说明之处均是本领域技术人员可根据现有技术理解或编程实现的。

本发明是一种基于Spark平台的短时交通流量预测方法,如图1所示,包括如下步骤:

本实施例选择某高速公路2012年7月至2015年7月的交通流数据作为实验数据,其中选择2012年7月至2015年6月的交通流数据作为历史数据库,2015年7月的数据作为测试数据库。

分别对历史数据和测试数据进行数据预处理,如图2所示,包括如下步骤

利用textFile()读取存入到HDFS文件系统的原始数据,利用map()函数读取文件系统中的每一行数据,并利用split()函数对该行数据按照分割符进行分割,最后再次使用map()函数将需要的字段进行提取,形成一个MappedRDD类型的数据集。

交通流量的时空关系是指,城市某路段车流量与该路段上下游路段的车流量有关。城市某路段车流量还与该路段上一时刻的车流量有关。

我们采用平均相对误差作为并行化KNN算法预测精度的评价指标:

平均相对误差公式为:

<mrow> <mi>M</mi> <mi>R</mi> <mi>E</mi> <mo>=</mo> <mfrac> <mn>1</mn> <mi>N</mi> </mfrac> <mrow> <mo>(</mo> <munderover> <mo>&Sigma;</mo> <mrow> <mi>t</mi> <mo>=</mo> <mn>1</mn> </mrow> <mi>N</mi> </munderover> <mfrac> <mrow> <mo>|</mo> <msub> <mi>x</mi> <mrow> <mi>r</mi> <mi>e</mi> <mi>a</mi> <mi>l</mi> </mrow> </msub> <mo>-</mo> <msub> <mi>x</mi> <mrow> <mi>p</mi> <mi>r</mi> <mi>e</mi> </mrow> </msub> <mo>|</mo> </mrow> <msub> <mi>x</mi> <mrow> <mi>r</mi> <mi>e</mi> <mi>a</mi> <mi>l</mi> </mrow> </msub> </mfrac> <mo>)</mo> </mrow> </mrow>

当预测间隔为5分钟时,时间维度为2,空间维度为4时,预测结果的MRE值最小。

所以本发明选择测试路段上游两个邻近路段和下游两个邻近路段同一时刻与上一时刻的交通流量组成一个交通流特征向量。

由图3基于时空特性的交通流量预测示意图可得到:

输入分布式KNN算法的交通流特征向量为:

X=(x(p-2,t0),x(p-1,t0),x(p,t0),x(p+1,t0),x(p-2,t0-Δt),

x(p-1,t0-Δt),x(p,t0-Δt),x(p+1,t0-Δt))

预测的交通流量为Y=x(p,t0+Δt)

由图4和图5可以看出基于时空关系交通流特征向量的预测结果明显好于基于时间关系交通流特征向量的预测结果。

利用Spark Streaming时刻检测输入数据是否有更新,当在设置的窗口时间内输入数据有所变化,系统会自动进行下一次的交通流量预测工作。具体包括如下步骤:

设置Spark Streaming的窗口时间为5分钟。

利用StreamingContext创建一个Spark Streaming Context对象。

利用socketTextStream()获得一个Dstream对象负责连接监听端口。

5分钟内若输入数据有更新则重新运行预测程序。

KNN算法的近邻搜索是指计算历史数据库交通流特征向量与测试数据库交通流特征向量之间的欧氏距离或者指数权重距离,进而从交通流历史数据库中找出测试数据的K个最近邻数据集合。

KNN算法的预测精度与K个近邻的选取个数有关,本数据集中当K值选择为20左右时其平均相对误差最小,所以本发明在近邻匹配时选取了20个近邻。

并行化KNN算法能有效解决传统KNN算法在近邻查找过程中搜索历史数据库效率过低的问题,提高算法的计算效率,有效的改善了KNN预测算法的实用性。

如图6所示,并行化KNN算法的实现包括如下步骤:

数据分区:数据分区的目的是将大规模数据集分成几个分区,每个分区的数据会在Spark集群中的一个物理机上进行计算,这样在每台物理机上进行计算的数据量会成倍减少,从而减少数据的处理时间。

数据分区的具体实现包括如下步骤:

对输入数据调用mapPartitions()函数,该函数可以将输入数据分成用户指定个数的分区数,该函数的输入为一个自定义函数。

mapPartitions()函数的具体代码如下:

我们自定义两个函数subArrFunf()和subArrFunh(),这两个函数的主要功能是获得输入分布式KNN算法的交通流特征向量。

获得历史数据库的交通流特征向量函数subArrFunh()具体代码如下:

将我们定义的subArrFunf()和subArrFunh()函数作为参数传入到mapPartitions()函数中,这样就完成了输入数据的分区以及获得输入交通流特征向量的工作。

获得测试和历史交通流特征向量的具体代码如下:

val testNodes=testData.mapPartitions(subArrFunf).collect()

val historyNodes=historyData.mapPartitions(subArrFunh).collect()

数据分析阶段是指从历史数据库中找到与预测路段交通流特征向量最接近的20个近邻数据集合。

具体实现过程包括如下步骤:

通过map()函数将KNN算法特征向量相似度计算的任务进行并行化处理。

map()函数的具体代码如下:

def map取出历史数据交通流特征向量和测试数据交通流特征向量对应位置的数据,计算它们之间的欧式距离。

计算欧式距离的具体代码如下:

val distance=Math.sqrt(Math.pow(a1-b1,2)+Math.pow(a2-b2,2)+

Math.pow(a3-b3,2)+Math.pow(a4-b4,2)+Math.pow(a5-b5,2))+…

将集群各个节点的计算结果集中到集群的一台机器中,并进行排序,根据排序结果加权求出待测路段下一时刻的交通流量。

val sortList=list.sortBy(item=>item._1)

for(i<-0to 20){flows+=sortList(i)._2}

我们采用扩展性和加速比作为并行化KNN算法预测时间的评价指标。

扩展性是衡量系统是否具有处理更大规模问题能力的重要指标。可扩展性意味着通过扩展系统资源,系统可以应对数据规模增长时的数据处理需求。

加速比是衡量并行化算法与分布式平台性能的重要指标,其公式如下:

<mrow> <mi>s</mi> <mi>p</mi> <mo>=</mo> <mfrac> <msub> <mi>T</mi> <mi>s</mi> </msub> <msub> <mi>T</mi> <mi>p</mi> </msub> </mfrac> </mrow>

其中Ts为串行算法的运行时间,Tp为并行算法的运行时间,加速比描述的是将算法并行化后的运行速度比串行算法快多少倍,通过加速比指标可以直观的反应分布式系统的性能。

从图7中可以看出基于Spark的并行KNN模型在数据规模增大时表现出很好的计算能力,相比传统KNN模型,并行KNN模型的计算效率有明显提高。

从图8和图9可以看出基于Spark的并行KNN模型具有良好的扩展性和加速比。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1