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

2021-07-24 17:50:35 字數 3161 閱讀 1853

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

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

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

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

圖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演算法在多種語言和包裡都有實現。下面的**片段是基於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]) =

然後,我們將用spark對整個使用者集合來並行dbscan演算法。 這個操作作為spark的pairrdd功能的一部分已經可以使用了,它叫做mapvalues:

val clustersrdd = checkinsrdd.mapvalues(dbscan(_))

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

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

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

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

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

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

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

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

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

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

用scikit learn學習DBSCAN聚類

在dbscan密度聚類演算法中,我們對dbscan聚類演算法的原理做了總結,本文就對如何用scikit learn來學習dbscan聚類做乙個總結,重點講述引數的意義和需要調參的引數。在scikit learn中,dbscan演算法類為sklearn.cluster.dbscan。要熟練的掌握用db...

用scikit learn學習DBSCAN聚類

在dbscan密度聚類演算法中,我們對dbscan聚類演算法的原理做了總結,本文就對如何用scikit learn來學習dbscan聚類做乙個總結,重點講述引數的意義和需要調參的引數。在scikit learn中,dbscan演算法類為sklearn.cluster.dbscan。要熟練的掌握用db...

相對位址和絕對位址

什麼是相對位址 document.location.href 就是相對位址跳轉,這個方法實現的是在當前路徑的基礎上進行跳轉 什麼是絕對位址 網路位址顧名思義就是直接跳轉到網路的位址,以http或者https等開頭的位址,這種位址可以直接跳轉到頁面 本地位址如果沒有特別說明在哪乙個盤,那麼所有的跳轉都...