用Spark和DBSCAN对地理定位数据进行聚类
機(jī)器學(xué)習(xí),特別是聚類算法,可以用來確定哪些地理區(qū)域經(jīng)常被一個用戶訪問和簽到而哪些區(qū)域不是。這樣的地理分析使多種服務(wù)成為可能,比如基于地理位置的推薦系統(tǒng),先進(jìn)的安全系統(tǒng),或更通常來說,提供更個性化的用戶體驗(yàn)。
在這篇文章中,我會確定對每個人來說特定的地理活動區(qū)域,討論如何從大量的定位事件中(比如在餐廳或咖啡館的簽到)獲取用戶的活動區(qū)域來構(gòu)建基于位置的服務(wù)。舉例來說,這種系統(tǒng)可以識別一個用戶經(jīng)常外出吃晚飯的區(qū)域。
使用DBSCAN聚類算法
首先,我們需要選擇一種適用于定位數(shù)據(jù)的聚類算法,可以基于提供的數(shù)據(jù)點(diǎn)的局部密度確定用戶的活動區(qū)域。DBSCAN算法是一個不錯的選擇,因?yàn)樗韵露系剡x擇一個點(diǎn)并在一個給定的距離尋找更多的點(diǎn)。然后通過重復(fù)這個過程擴(kuò)展尋找新的點(diǎn)來擴(kuò)展類簇,直到無法再擴(kuò)大為止。
這個算法可以通過兩個參數(shù)進(jìn)行調(diào)試: ε,用來確定離給定的點(diǎn)多遠(yuǎn)來搜索;和minPoints,即為了類簇?cái)U(kuò)展,決定一個給定的點(diǎn)的鄰域附近最少有多少點(diǎn)。通過尋找鄰近點(diǎn),本地類簇開始出現(xiàn),各種形狀的類簇逐漸可以被識別(請參見圖1的簡化描述)。過于孤立的點(diǎn)和離其他點(diǎn)太遠(yuǎn)的點(diǎn)則會被分配到一個特殊的異常值集群。這些獨(dú)特的屬性使DBSCAN算法適合對地理定位事件進(jìn)行聚類。
圖1:兩由DBSCAN算法(ε= 0.5和minPoints = 5)聚類得出的兩個類簇。一個是L型,另一個是圓形。互相靠近的點(diǎn)被分配到相同的類簇。黑色的孤立點(diǎn)被視為“異常點(diǎn)”。圖片來自Natalino Busa。
在Spark里使用PairRDDs
在大多數(shù)實(shí)際應(yīng)用中,機(jī)器學(xué)習(xí)系統(tǒng)必須處理數(shù)以百萬計(jì)的用戶和數(shù)十億的事件。因此,隨著越來越多的用戶和事件被添加到系統(tǒng)中,一個精心設(shè)計(jì)的數(shù)據(jù)處理通道需要具備快速和可伸縮的特點(diǎn)。這就需要分布式計(jì)算。就我們的目標(biāo)而言,Spark作為一個分布式處理引擎,是一個很好的選擇,因?yàn)樗峁┝四軌蛟诙鄼C(jī)器上并行執(zhí)行許多基于地理定位的聚類任務(wù)的計(jì)算框架。
在Spark里,用戶地理定位數(shù)據(jù)可以使用稱為PairRDD的對象來建模。PairRDD是一個分布式的元組集合(鍵,值),根據(jù)關(guān)鍵字段被劃分到多個機(jī)器。特別是對于地理定位數(shù)據(jù),我們選擇的鍵是用戶標(biāo)識符,值是給定用戶的所有簽到的聚合列表。
地理定位數(shù)據(jù)放置在一個n×2的矩陣中,其中第一列表示經(jīng)度,第二列表示緯度。參見下面的例子,這是Spark數(shù)據(jù)類型中的PairRDD集合,以及元祖的一個例子:
org.apache.spark.rdd.RDD[(Long, breeze.linalg.DenseMatrix[Double])]
(15474,? DenseMatrix( 40.8379525833 -73.70209875
40.6997066969 -73.8085234165
40.7484436586 -73.9857316017
40.750613794? -73.993434906 ))
DBSCAN在Spark中并發(fā)運(yùn)行
DBSCAN算法在多種語言和包里都有實(shí)現(xiàn)。下面的代碼片段是基于DBSCAN 在GitHub上的scala?nlp /nak庫中的實(shí)現(xiàn)。
假設(shè)給定用戶經(jīng)常訪問城市的三個區(qū)域,一個區(qū)域是經(jīng)常參加酒宴和聚會的,另一個是經(jīng)常來舒適放松的,還有一個是和朋友一起吃晚餐的。如果這些區(qū)域位于城市的不同部分,下面的代碼通過查看每個事件的位置將其分到不同類簇。在這段代碼中,我們尋找距離約100米的范圍內(nèi)的事件(約0.001度),如果至少有三個點(diǎn)互相接近,我們便開始進(jìn)行聚類。
import breeze.numerics._
import nak.cluster._
import nak.cluster.GDBSCAN._
def dbscan(v : breeze.linalg.DenseMatrix[Double]) = {
val gdbscan = new GDBSCAN(
DBSCAN.getNeighbours(epsilon = 0.001, distance = Kmeans.euclideanDistance),
DBSCAN.isCorePoint(minPoints = 3)
)
val clusters = gdbscan cluster v
}
然后,我們將用Spark對整個用戶集合來并行dbscan算法。 這個操作作為Spark的PairRDD功能的一部分已經(jīng)可以使用了,它叫做mapValues:
val clustersRdd = checkinsRdd.mapValues(dbscan(_))
簡而言之,定位數(shù)據(jù)的聚類在Spark中可以這樣實(shí)現(xiàn),將位置的原始PairRDD轉(zhuǎn)換到一個新的PairRDD,其中元組的鍵值分別代表用戶的ID,和其對應(yīng)的定位類簇。一旦定位數(shù)據(jù)被聚類完畢,它可以進(jìn)一步概括總結(jié),比如確定每個類簇的邊界框或輪廓
圖2顯示了從一個使用Gowalla(用戶在特定地點(diǎn)簽到分享他們的位置的社交網(wǎng)站)的匿名用戶的定位數(shù)據(jù)中提取的一個示例類簇。圖中是佛羅里達(dá)地圖,特別是開普科勒爾地區(qū),簽到的地方會有一個帶顏色的點(diǎn)。
事件根據(jù)其發(fā)生的地理位置被聚類。例如在Estero Bay?(暗橙色圓點(diǎn))漫步、在機(jī)場的聚集活動(棕色點(diǎn))和森尼貝爾島的聚集活動(綠點(diǎn))屬于不同的聚類(ε設(shè)定為3公里,minPoints設(shè)置為3)。
圖2:從用戶的佛羅里達(dá)開普科勒爾區(qū)域的Gowalla數(shù)據(jù)集中提取聚類的例子。注意點(diǎn)集合的密度與聚類正確匹配,異常值標(biāo)記為孤立的黑點(diǎn)。圖片來自Natalino Busa。地圖重疊:OpenStreet地圖。
進(jìn)一步增強(qiáng)地理定位數(shù)據(jù)分析
這一分析是圍繞地理坐標(biāo)進(jìn)行的,但可以很容易地?cái)U(kuò)展到其他事件屬性上,如簽到時間、場地類型(餐廳、體育館、博物館)或用戶的狀態(tài)。聚類算法還可以將用戶社交網(wǎng)絡(luò)中朋友所生成的事件考慮進(jìn)來,從而得以應(yīng)用于一個更大的上下文。
Spark為SQL數(shù)據(jù)處理提供了一個模塊,可用于在運(yùn)行聚類算法之前運(yùn)行查詢來過濾和收集事件。通過這種方式,數(shù)據(jù)處理通道可以在Spark上完整地實(shí)現(xiàn)SQL和機(jī)器學(xué)習(xí)的統(tǒng)一框架。這種擴(kuò)展的數(shù)據(jù)管道對特定類別的事件將提供更準(zhǔn)確的聚類結(jié)果。
創(chuàng)建一個基于位置的API 服務(wù)
Spark產(chǎn)生的聚類分析結(jié)果可以保存在一個數(shù)據(jù)存儲表中。一個API服務(wù)可以查詢該表,并確定一個新出現(xiàn)的地理位置點(diǎn)是否屬于已知的地區(qū)。API服務(wù)可以根據(jù)用戶場景觸發(fā)適當(dāng)?shù)男袨椤@?#xff0c;它可以通過消息向用戶告警、發(fā)送通知或提供推薦。
結(jié)論
我最初的實(shí)驗(yàn)表明Spark提供了堅(jiān)實(shí)的基礎(chǔ)設(shè)施在大量的用戶和事件上來并行處理和分發(fā)機(jī)器學(xué)習(xí)算法。此外,Spark通過在一個數(shù)據(jù)處理框架結(jié)合SQL查詢和機(jī)器學(xué)習(xí),加快了數(shù)據(jù)驅(qū)動系統(tǒng)的開發(fā)。
DBSCAN算法與Spark的結(jié)合似乎是一種很有前途的方法,可以抽取準(zhǔn)確的地理位置模式,并用于開發(fā)基于各種場景的數(shù)據(jù)驅(qū)動、基于位置的應(yīng)用程序,例如個性化營銷、欺詐防范和內(nèi)容過濾。
原文發(fā)布時間為:2017-01-21
本文來自云棲社區(qū)合作伙伴“大數(shù)據(jù)文摘”,了解相關(guān)信息可以關(guān)注“BigDataDigest”微信公眾號
總結(jié)
以上是生活随笔為你收集整理的用Spark和DBSCAN对地理定位数据进行聚类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ajax监测开始执行及结束执行
- 下一篇: 【重大更新】DevExpress v17