Python中的GPS軌跡聚類
當我們想要利用智慧手機或智慧手環等個人裝置生成的GPS資料時,G PS軌跡聚類是一種常見的分析。
在本文中,我們將介紹一種在Python中執行GPS軌跡聚類的快速簡便方法。這裡的主要目標是建立包含“相似”軌跡的聚類。例如,我們希望將每天從工作到家的路徑放在同一個聚類中。
本文分為兩個主要部分。首先,我們將描述聚類演算法。在第二部分中,我們將展示如何在Python中使用和自定義演算法。
神經影象演算法與GPS軌跡聚類
在本文中,我們使用了一種用於neuromaging的聚類演算法,而不是像K-Means或DBSCAN那樣使用經典的聚類演算法。
QuickBundles (QB)是一種簡單的聚類演算法,用於磁共振成像中對應用tractography演算法得到的白質纖維進行聚類。
只需檢視下圖,我們就可以看到大腦中的白質纖維看起來像GPS軌跡。
主要思想是將每個GPS軌跡視為白質纖維,然後在同一個聚類中合併“相似”軌跡。在本文的其餘部分,我們將假設GPS Trajectory = White Matter Fiber。
有了這個假設,我們就可以使用原始論文中提供的演算法描述:
演算法如下進行。在演算法的任何一步,我們都有 M個clusters。選擇第一個streamline s1並將其放在第一個cluster c1 ←({1},s1,1); 此時M = 1。對於每個剩餘的streamlines,依次 i = 2 ,. 。。,N:
(i)計算streamline si與所有當前聚類 ce 的質心streamline ve之間的距離 , e = 1 ,. 。。,M,其中v動態定義為v = h/n;
(ii)如果任何距離的值me小於聚類閾值θ,,將streamlined i新增到聚類e,最小值為me; ce =(I,h,n),並更新 ce ←(append(I, i), h + s, n + 1); 否則建立一個新的cluster cM + 1 ←([i],si,1),M←M + 1.
在下圖中,我們展示了演算法如何根據給定的閾值合併公共質心中的不同streamlines 的示例。
閾值是THE要選擇的引數,以優化聚類演算法的行為。如果你想要“大”軌跡,你可以設定閾值的高值。否則,如果您想要小聚類,則需要較低的值。
該論文的作者提供了所提出方法的Python實現。該演算法作為dipy庫的一部分提供,而演算法的文件可在此處獲得(http://nipy.org/dipy/examples_built/segment_quickbundles.html#)。
GPS軌跡聚類
我們使用的資料集來自微軟亞洲研究院釋出的GeoLife GPS Trajectories資料集,可在此處獲得(https://www.microsoft.com/en-us/download/details.aspx?id=52367)。該資料集文件:https://yidatao.github.io/2016-12-23/geolife-dbscan/。
在開始執行聚類之前,讓我們使用gmplot繪製谷歌地圖上的所有軌跡。
我們現在可以從定義兩個GPS軌跡(streamlines)之間的距離函式開始。我們將使用GeoPy庫中定義的GPS距離,而不是使用QuickBundle中提供的經典歐幾里得距離。
我們計算了兩個軌跡之間的平均點的GPS距離。這種計算距離的方法可以在且僅當兩個軌跡具有相同數量的點時使用,這就是為什麼我們使用ResampleFeature類重新取樣所有軌跡的原因。
一旦定義了兩條軌跡之間的距離,就可以執行QuickBundle聚類演算法。
然後,我們可以像以前一樣使用gmplot繪製谷歌地圖上不同聚類中包含的軌跡。
這裡是my_map.html的結果,用於繪製不同的聚類
結論
在本文中,我們描述了一種簡單快速的方法來執行GPS資料的軌跡聚類。目標是使用QuickBundles實現的,QuickBundles是一種應用於神經成像的聚類演算法。
該演算法的主要限制與閾值引數的調整有關。但是,作為資料分析中的所有內容,需要根據所需的群集型別選擇此引數。