用Spark和DBSCAN對地理定位資料進行聚類

OReillyData發表於2016-08-31

機器學習,特別是聚類演算法,可以用來確定哪些地理區域經常被一個使用者訪問和簽到而哪些區域不是。這樣的地理分析使多種服務成為可能,比如基於地理位置的推薦系統,先進的安全系統,或更通常來說,提供更個性化的使用者體驗。

在這篇文章中,我會確定對每個人來說特定的地理活動區域,討論如何從大量的定位事件中(比如在餐廳或咖啡館的簽到)獲取使用者的活動區域來構建基於位置的服務。舉例來說,這種系統可以識別一個使用者經常外出吃晚飯的區域。

使用DBSCAN聚類演算法

首先,我們需要選擇一種適用於定位資料的聚類演算法,可以基於提供的資料點的區域性密度確定使用者的活動區域。DBSCAN演算法是一個不錯的選擇,因為它自下而上地選擇一個點並在一個給定的距離尋找更多的點。然後通過重複這個過程擴充套件尋找新的點來擴充套件類簇,直到無法再擴大為止。

這個演算法可以通過兩個引數進行除錯: ε,用來確定離給定的點多遠來搜尋;和minPoints,即為了類簇擴充套件,決定一個給定的點的鄰域附近最少有多少點。通過尋找鄰近點,本地類簇開始出現,各種形狀的類簇逐漸可以被識別(請參見圖1的簡化描述)。過於孤立的點和離其他點太遠的點則會被分配到一個特殊的異常值叢集。這些獨特的屬性使DBSCAN演算法適合對地理定位事件進行聚類。

640?wx_fmt=jpeg

圖1:兩由DBSCAN演算法(ε= 0.5和minPoints = 5)聚類得出的兩個類簇。一個是L型,另一個是圓形。互相靠近的點被分配到相同的類簇。黑色的孤立點被視為“異常點”。圖片來自Natalino Busa。

在Spark裡使用PairRDDs

在大多數實際應用中,機器學習系統必須處理數以百萬計的使用者和數十億的事件。因此,隨著越來越多的使用者和事件被新增到系統中,一個精心設計的資料處理通道需要具備快速和可伸縮的特點。這就需要分散式計算。就我們的目標而言,Spark作為一個分散式處理引擎,是一個很好的選擇,因為它提供了能夠在多機器上並行執行許多基於地理定位的聚類任務的計算框架。

在Spark裡,使用者地理定位資料可以使用稱為PairRDD的物件來建模。PairRDD是一個分散式的元組集合(鍵,值),根據關鍵欄位被劃分到多個機器。特別是對於地理定位資料,我們選擇的鍵是使用者識別符號,值是給定使用者的所有簽到的聚合列表。

地理定位資料放置在一個n×2的矩陣中,其中第一列表示經度,第二列表示緯度。參見下面的例子,這是Spark資料型別中的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中併發執行

DBSCAN演算法在多種語言和包裡都有實現。下面的程式碼片段是基於DBSCAN 在GitHub上的scala nlp /nak庫中的實現。

假設給定使用者經常訪問城市的三個區域,一個區域是經常參加酒宴和聚會的,另一個是經常來舒適放鬆的,還有一個是和朋友一起吃晚餐的。如果這些區域位於城市的不同部分,下面的程式碼通過檢視每個事件的位置將其分到不同類簇。在這段程式碼中,我們尋找距離約100米的範圍內的事件(約0.001度),如果至少有三個點互相接近,我們便開始進行聚類。

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功能的一部分已經可以使用了,它叫做mapValues:

val clustersRdd = checkinsRdd.mapValues(dbscan(_))

簡而言之,定位資料的聚類在Spark中可以這樣實現,將位置的原始PairRDD轉換到一個新的PairRDD,其中元組的鍵值分別代表使用者的ID,和其對應的定位類簇。一旦定位資料被聚類完畢,它可以進一步概括總結,比如確定每個類簇的邊界框或輪廓

圖2顯示了從一個使用Gowalla(使用者在特定地點簽到分享他們的位置的社交網站)的匿名使用者的定位資料中提取的一個示例類簇。圖中是佛羅里達地圖,特別是開普科勒爾地區,簽到的地方會有一個帶顏色的點。

事件根據其發生的地理位置被聚類。例如在Estero Bay (暗橙色圓點)漫步、在機場的聚集活動(棕色點)和森尼貝爾島的聚集活動(綠點)屬於不同的聚類(ε設定為3公里,minPoints設定為3)。

640?wx_fmt=jpeg

圖2:從使用者的佛羅里達開普科勒爾區域的Gowalla資料集中提取聚類的例子。注意點集合的密度與聚類正確匹配,異常值標記為孤立的黑點。圖片來自Natalino Busa。地圖重疊:OpenStreet地圖。

進一步增強地理定位資料分析

這一分析是圍繞地理座標進行的,但可以很容易地擴充套件到其他事件屬性上,如簽到時間、場地型別(餐廳、體育館、博物館)或使用者的狀態。聚類演算法還可以將使用者社交網路中朋友所生成的事件考慮進來,從而得以應用於一個更大的上下文。

Spark為SQL資料處理提供了一個模組,可用於在執行聚類演算法之前執行查詢來過濾和收集事件。通過這種方式,資料處理通道可以在Spark上完整地實現SQL和機器學習的統一框架。這種擴充套件的資料管道對特定類別的事件將提供更準確的聚類結果。

建立一個基於位置的API 服務

Spark產生的聚類分析結果可以儲存在一個資料儲存表中。一個API服務可以查詢該表,並確定一個新出現的地理位置點是否屬於已知的地區。API服務可以根據使用者場景觸發適當的行為。例如,它可以通過訊息向使用者告警、傳送通知或提供推薦。

結論

我最初的實驗表明Spark提供了堅實的基礎設施在大量的使用者和事件上來並行處理和分發機器學習演算法。此外,Spark通過在一個資料處理框架結合SQL查詢和機器學習,加快了資料驅動系統的開發。

DBSCAN演算法與Spark的結合似乎是一種很有前途的方法,可以抽取準確的地理位置模式,並用於開發基於各種場景的資料驅動、基於位置的應用程式,例如個性化營銷、欺詐防範和內容過濾。

640?wx_fmt=jpeg

Natalino Busa

Natalino在荷蘭ING集團任職企業資料架構師,他設計了大規模快速資料驅動的應用程式資料解決方案,如個性化營銷、預測分析、欺詐檢測和安全管理。他是一個全面的資料專家,在可擴充套件的服務、資料科學和資料處理系統上有豐富的經驗。此前,他擔任在荷蘭的飛利浦研究實驗室的資深科學家,在那裡他專注於系統級晶片架構、分散式計算和並行化編譯器。

相關文章