本發(fā)明屬于云計算和數(shù)據(jù)挖掘領(lǐng)域,具體涉及基于Spark平臺的短時交通流量預(yù)測方法。
背景技術(shù):
短時交通流量預(yù)測是指對特定路段未來幾分鐘的車流量做出預(yù)測。短時交通流量預(yù)測是解決城市交通擁堵的重要途徑,而隨著城市汽車數(shù)量的增加,交通流量的數(shù)據(jù)量急劇增加。單機進行基于位置數(shù)據(jù)的短時交通流量預(yù)測面臨著數(shù)據(jù)量大存儲困難、計算時間長等問題。而云計算平臺在海量數(shù)據(jù)存儲和大規(guī)模并行實時處理方面具有強大的技術(shù)優(yōu)勢,可以在保證預(yù)測精度的前提下,有效的提高短時交通流量預(yù)測的計算效率。
在眾多分類算法中,KNN算法是一種最簡單常用的算法,KNN算法預(yù)測精度很高,但由于在相似度計算過程中,每一個待分類的樣本都要計算它到所有已知樣本的距離,以確定它的K個最近鄰點。隨著數(shù)據(jù)量的增大,會造成相似度計算量過大、從而導(dǎo)致計算效率較低的問題,這樣嚴重限制了KNN算法在數(shù)據(jù)挖掘工作中的應(yīng)用。而在Spark平臺上將KNN算法進行分布式實現(xiàn),有效的解決了KNN算法近鄰查找過程中搜索歷史數(shù)據(jù)庫效率過低的問題,提高了算法的計算效率,有效的改善了KNN預(yù)測算法的實用性。
Spark是一個通用的大規(guī)模數(shù)據(jù)快速處理引擎,它是由UC Berkeley AMP lab所開源的類Hadoop MapReduce的通用的并行計算框架。Spark是基于內(nèi)存的迭代計算框架,它使用了RDD的理念,可以在內(nèi)存中存儲數(shù)據(jù),只在需要時才持久化到磁盤中。這樣做可以在很大程度上減少了數(shù)據(jù)處理過程中磁盤的讀寫,大幅度的降低了任務(wù)執(zhí)行所需時間,因此Spark能更好的適用于數(shù)據(jù)挖掘和機器學(xué)習(xí)等需要反復(fù)迭代的算法。Spark還支持SQL查詢、流式查詢及圖計算等。在分布式數(shù)據(jù)集計算時,Spark可以通過checkpoint機制來實現(xiàn)容錯。
目前,國內(nèi)的阿里巴巴、優(yōu)酷土豆、百度、騰訊、網(wǎng)易、搜狐等互聯(lián)網(wǎng)公司已經(jīng)將Spark技術(shù)應(yīng)用到了自己的商業(yè)生產(chǎn)系統(tǒng)中。百度擁有國內(nèi)最大的Spark集群,已應(yīng)用于鳳巢、大搜索、直達號、百度大數(shù)據(jù)等業(yè)務(wù)中;阿里巴巴將Spark運用于淘寶的推薦相關(guān)算法上,同時還利用Spark圖計算解決了許多實際生產(chǎn)問題。對于短時交通流量預(yù)測,隨著交通數(shù)據(jù)量的成倍增加,傳統(tǒng)的單機數(shù)據(jù)挖掘模式已經(jīng)很難滿足實際應(yīng)用要求。將Spark大數(shù)據(jù)平臺與短時交通流量預(yù)測相結(jié)合,可以使這一應(yīng)用更加滿足實際需要,同時對其他應(yīng)用的研究也非常有借鑒價值。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于提供一種基于Spark大數(shù)據(jù)平臺的短時交通流量預(yù)測方法,在Spark集群上,對KNN算法進行并行化實現(xiàn),通過并行化的對交通流量數(shù)據(jù)進行處理,加速數(shù)據(jù)處理過程,預(yù)測待測路段下一時刻的交通流量。
本發(fā)明的目的通過如下技術(shù)方案實現(xiàn)。
一種基于Spark平臺的短時交通流量預(yù)測方法,包括以下步驟:
數(shù)據(jù)預(yù)處理:處理源交通流量數(shù)據(jù),剔除與交通流量預(yù)測無關(guān)的數(shù)據(jù)字段。
基于時空關(guān)系的流量預(yù)測:利用與待測路段在時間和空間相關(guān)聯(lián)路段的交通流量共同生成KNN算法的交通流特征向量。
實時流處理:利用Spark流計算解決了交通流量預(yù)測的實時性問題。
并行化KNN算法實現(xiàn):對KNN算法進行并行化實現(xiàn),使得KNN算法能夠在分布式集群Spark上運行。
數(shù)據(jù)分析:利用并行化KNN算法,對基于時空關(guān)系生成的交通流特征向量進行處理,得到待測路段下一時刻交通流量的預(yù)測結(jié)果。
進一步地,數(shù)據(jù)預(yù)處理是對由道路傳感器收集到的源交通流數(shù)據(jù)進行處理,得到與預(yù)測路段相關(guān)的字段數(shù)據(jù)以及與待測路段在時間和空間相關(guān)聯(lián)路段的交通流數(shù)據(jù),包括如下步驟:
將傳感器收集到的交通流量數(shù)據(jù)存儲到Hadoop的HDFS文件系統(tǒng)中。
利用textFile()函數(shù)將存儲到HDFS文件系統(tǒng)中的交通流量數(shù)據(jù)讀入到Spark中,并生成一個Spark中特有的數(shù)據(jù)類型MappedRDD。
利用map()函數(shù),讀取每一行交通流量數(shù)據(jù),并利用Spark中的split()函數(shù)對每一行數(shù)據(jù)按照分隔符進行分割,最后將需要的交通流字段數(shù)據(jù)進行提取。
進一步地,基于時空關(guān)系的特征向量是對交通流數(shù)據(jù)進行時空特性分析,確定最佳的時間和空間維度,以此形成最佳的交通流輸入向量,包括如下步驟:
確定最佳時間維度為2,即選取相關(guān)路段當前時刻和前一時刻的交通流量,時間間隔為5分鐘
確定最佳空間維度為4,即選取待測路段、兩個上游路段和一個下游路段的交通流量數(shù)據(jù)。
進一步地,實時流處理是利用Spark流計算時刻檢測輸入數(shù)據(jù)是否有更新,當數(shù)據(jù)有更新時,系統(tǒng)自動進行下一次的交通流量預(yù)測工作,以滿足短時交通流量預(yù)測對于實時性的要求,包括如下步驟:
設(shè)置Spark Streaming的窗口時間為5分鐘。
利用StreamingContext創(chuàng)建一個Spark Streaming Context對象。
利用socketTextStream()獲得一個Dstream對象負責(zé)連接監(jiān)聽端口。
進一步地,并行化KNN算法實現(xiàn)是指對傳統(tǒng)的基于單機運行的KNN算法重新進行實現(xiàn),使并行化的KNN算法能夠在由多臺物理機組成的集群上運行,包括如下步驟:
利用mapPartitions()函數(shù)將已經(jīng)處理好的交通流量數(shù)據(jù)分成幾個分區(qū),其中每個分區(qū)的數(shù)據(jù)在Spark集群中會在一個物理機上進行計算。
定義一個函數(shù),這個函數(shù)的功能是獲得待測路段及與待測路段在時間和空間相關(guān)聯(lián)路段的交通流量所組成的特征向量。
將定義的這個函數(shù)作為mapPartitions()函數(shù)的參數(shù)。
數(shù)據(jù)分析是指在Spark集群上運行實現(xiàn)的并行化KNN算法,預(yù)測待測路段下一時刻的交通流量,包括如下步驟:
從歷史數(shù)據(jù)庫中利用歐式距離匹配到與當前待測路段交通流量最接近的K個交通流量數(shù)據(jù)。
取當前該K個交通流量向量的下一時刻交通流量的加權(quán)平均值作為預(yù)測路段下一時刻的交通流量。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點:
本發(fā)明通過數(shù)據(jù)預(yù)處理對原始數(shù)據(jù)的高維特征集進行了刪減,除去了特征集中的冗余信息,減少了數(shù)據(jù)量。
本發(fā)明通過在Spark平臺上對KNN算法進行并行化的實現(xiàn),使KNN算法能夠并行的進行特征向量相似度的計算工作,解決了KNN算法在相似度計算過程中計算效率較低的問題。
利用Spark強大的流處理功能,時刻檢測輸入數(shù)據(jù)的變化情況,當數(shù)據(jù)發(fā)生更新時系統(tǒng)能夠自動的進行下一次的預(yù)測工作。因此可以滿足短時交通流量預(yù)測對于實時性的要求。
將Spark平臺與短時交通流量預(yù)測這一應(yīng)用相結(jié)合,可以大幅度縮減進行交通流量的預(yù)測時間,使這一應(yīng)用更加滿足實際環(huán)境的要求。
附圖說明
圖1為本發(fā)明一種基于Spark平臺的短時交通流量預(yù)測方法的流程圖。
圖2為數(shù)據(jù)預(yù)處理流程圖。
圖3為基于時空特性的交通流量預(yù)測示意圖。
圖4是基于時空特性與基于時間特性交通流量預(yù)測結(jié)果對比圖。
圖5為基于時空特性與基于時間特性MRE指標對比圖。
圖6為并行化KNN算法實現(xiàn)流程圖。
圖7為傳統(tǒng)KNN算法與在Spark平臺上并行化的KNN算法的預(yù)測時間對比圖。
圖8為在Spark平臺上并行化的KNN算法擴展性示意圖。
圖9為在Spark平臺上并行化的KNN算法加速比示意圖。
具體實施方式
以下結(jié)合附圖對本發(fā)明的具體實施作進一步說明,但本發(fā)明的實施和保護不限于此,需指出的是,以下若有未特別詳細說明之處均是本領(lǐng)域技術(shù)人員可根據(jù)現(xiàn)有技術(shù)理解或編程實現(xiàn)的。
本發(fā)明是一種基于Spark平臺的短時交通流量預(yù)測方法,如圖1所示,包括如下步驟:
本實施例選擇某高速公路2012年7月至2015年7月的交通流數(shù)據(jù)作為實驗數(shù)據(jù),其中選擇2012年7月至2015年6月的交通流數(shù)據(jù)作為歷史數(shù)據(jù)庫,2015年7月的數(shù)據(jù)作為測試數(shù)據(jù)庫。
分別對歷史數(shù)據(jù)和測試數(shù)據(jù)進行數(shù)據(jù)預(yù)處理,如圖2所示,包括如下步驟
利用textFile()讀取存入到HDFS文件系統(tǒng)的原始數(shù)據(jù),利用map()函數(shù)讀取文件系統(tǒng)中的每一行數(shù)據(jù),并利用split()函數(shù)對該行數(shù)據(jù)按照分割符進行分割,最后再次使用map()函數(shù)將需要的字段進行提取,形成一個MappedRDD類型的數(shù)據(jù)集。
交通流量的時空關(guān)系是指,城市某路段車流量與該路段上下游路段的車流量有關(guān)。城市某路段車流量還與該路段上一時刻的車流量有關(guān)。
我們采用平均相對誤差作為并行化KNN算法預(yù)測精度的評價指標:
平均相對誤差公式為:
當預(yù)測間隔為5分鐘時,時間維度為2,空間維度為4時,預(yù)測結(jié)果的MRE值最小。
所以本發(fā)明選擇測試路段上游兩個鄰近路段和下游兩個鄰近路段同一時刻與上一時刻的交通流量組成一個交通流特征向量。
由圖3基于時空特性的交通流量預(yù)測示意圖可得到:
輸入分布式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ù)測的交通流量為Y=x(p,t0+Δt)
由圖4和圖5可以看出基于時空關(guān)系交通流特征向量的預(yù)測結(jié)果明顯好于基于時間關(guān)系交通流特征向量的預(yù)測結(jié)果。
利用Spark Streaming時刻檢測輸入數(shù)據(jù)是否有更新,當在設(shè)置的窗口時間內(nèi)輸入數(shù)據(jù)有所變化,系統(tǒng)會自動進行下一次的交通流量預(yù)測工作。具體包括如下步驟:
設(shè)置Spark Streaming的窗口時間為5分鐘。
利用StreamingContext創(chuàng)建一個Spark Streaming Context對象。
利用socketTextStream()獲得一個Dstream對象負責(zé)連接監(jiān)聽端口。
5分鐘內(nèi)若輸入數(shù)據(jù)有更新則重新運行預(yù)測程序。
KNN算法的近鄰搜索是指計算歷史數(shù)據(jù)庫交通流特征向量與測試數(shù)據(jù)庫交通流特征向量之間的歐氏距離或者指數(shù)權(quán)重距離,進而從交通流歷史數(shù)據(jù)庫中找出測試數(shù)據(jù)的K個最近鄰數(shù)據(jù)集合。
KNN算法的預(yù)測精度與K個近鄰的選取個數(shù)有關(guān),本數(shù)據(jù)集中當K值選擇為20左右時其平均相對誤差最小,所以本發(fā)明在近鄰匹配時選取了20個近鄰。
并行化KNN算法能有效解決傳統(tǒng)KNN算法在近鄰查找過程中搜索歷史數(shù)據(jù)庫效率過低的問題,提高算法的計算效率,有效的改善了KNN預(yù)測算法的實用性。
如圖6所示,并行化KNN算法的實現(xiàn)包括如下步驟:
數(shù)據(jù)分區(qū):數(shù)據(jù)分區(qū)的目的是將大規(guī)模數(shù)據(jù)集分成幾個分區(qū),每個分區(qū)的數(shù)據(jù)會在Spark集群中的一個物理機上進行計算,這樣在每臺物理機上進行計算的數(shù)據(jù)量會成倍減少,從而減少數(shù)據(jù)的處理時間。
數(shù)據(jù)分區(qū)的具體實現(xiàn)包括如下步驟:
對輸入數(shù)據(jù)調(diào)用mapPartitions()函數(shù),該函數(shù)可以將輸入數(shù)據(jù)分成用戶指定個數(shù)的分區(qū)數(shù),該函數(shù)的輸入為一個自定義函數(shù)。
mapPartitions()函數(shù)的具體代碼如下:
我們自定義兩個函數(shù)subArrFunf()和subArrFunh(),這兩個函數(shù)的主要功能是獲得輸入分布式KNN算法的交通流特征向量。
獲得歷史數(shù)據(jù)庫的交通流特征向量函數(shù)subArrFunh()具體代碼如下:
將我們定義的subArrFunf()和subArrFunh()函數(shù)作為參數(shù)傳入到mapPartitions()函數(shù)中,這樣就完成了輸入數(shù)據(jù)的分區(qū)以及獲得輸入交通流特征向量的工作。
獲得測試和歷史交通流特征向量的具體代碼如下:
val testNodes=testData.mapPartitions(subArrFunf).collect()
val historyNodes=historyData.mapPartitions(subArrFunh).collect()
數(shù)據(jù)分析階段是指從歷史數(shù)據(jù)庫中找到與預(yù)測路段交通流特征向量最接近的20個近鄰數(shù)據(jù)集合。
具體實現(xiàn)過程包括如下步驟:
通過map()函數(shù)將KNN算法特征向量相似度計算的任務(wù)進行并行化處理。
map()函數(shù)的具體代碼如下:
def map取出歷史數(shù)據(jù)交通流特征向量和測試數(shù)據(jù)交通流特征向量對應(yīng)位置的數(shù)據(jù),計算它們之間的歐式距離。
計算歐式距離的具體代碼如下:
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))+…
將集群各個節(jié)點的計算結(jié)果集中到集群的一臺機器中,并進行排序,根據(jù)排序結(jié)果加權(quán)求出待測路段下一時刻的交通流量。
val sortList=list.sortBy(item=>item._1)
for(i<-0to 20){flows+=sortList(i)._2}
我們采用擴展性和加速比作為并行化KNN算法預(yù)測時間的評價指標。
擴展性是衡量系統(tǒng)是否具有處理更大規(guī)模問題能力的重要指標??蓴U展性意味著通過擴展系統(tǒng)資源,系統(tǒng)可以應(yīng)對數(shù)據(jù)規(guī)模增長時的數(shù)據(jù)處理需求。
加速比是衡量并行化算法與分布式平臺性能的重要指標,其公式如下:
其中Ts為串行算法的運行時間,Tp為并行算法的運行時間,加速比描述的是將算法并行化后的運行速度比串行算法快多少倍,通過加速比指標可以直觀的反應(yīng)分布式系統(tǒng)的性能。
從圖7中可以看出基于Spark的并行KNN模型在數(shù)據(jù)規(guī)模增大時表現(xiàn)出很好的計算能力,相比傳統(tǒng)KNN模型,并行KNN模型的計算效率有明顯提高。
從圖8和圖9可以看出基于Spark的并行KNN模型具有良好的擴展性和加速比。