簡體   English   中英

使用KMeans算法和Python對地理位置坐標(緯度,長對)進行聚類

[英]Clustering geo location coordinates (lat,long pairs) using KMeans algorithm with Python

使用以下代碼聚類地理位置坐標會產生3個聚類:

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.cluster.vq import kmeans2, whiten

    coordinates= np.array([
               [lat, long],
               [lat, long],
                ...
               [lat, long]
               ])
    x, y = kmeans2(whiten(coordinates), 3, iter = 20)  
    plt.scatter(coordinates[:,0], coordinates[:,1], c=y);
    plt.show()

使用Kmeans進行位置聚類是否正確,因為它使用歐幾里德距離而非使用Haversine公式作為距離函數?

由於您的意思,k-means不是用於空間聚類的好算法。 相反,你可以使用scikit-learn的DBSCAN和hasrsine metric and ball-tree算法來完成這個聚類工作。

本教程演示了使用DBSCAN / hasrsine對緯度 - 經度空間數據進行聚類 ,並避免了所有這些歐幾里德距離問題:

df = pd.read_csv('gps.csv')
coords = df.as_matrix(columns=['lat', 'lon'])
db = DBSCAN(eps=eps, min_samples=ms, algorithm='ball_tree', metric='haversine').fit(np.radians(coords))

請注意,這特別使用了scikit-learn v0.15,因為一些早期/后期版本似乎需要計算全距離矩陣。 另請注意,eps值以弧度表示,而.fit()以半徑為單位獲取半正弦度量的坐標。

這在很大程度上取決於您的應用

  • 在赤道附近,結果應該相當准確。 接近其中一個極點,結果根本沒用。
  • 然而,它可以作為預處理步驟或具有低精度要求的應用,例如小的,非重疊的和非常不同的簇。

如果你真的需要Haversine公式,你可能想看看這個討論。 正如Anony-Mousse所說:

請注意,Haversine距離不適用於k均值或平均連鎖聚類,除非您找到一種計算平均值的智能方法,以最小化方差。 如果您具有緯度 - 經度坐標的-180 / + 180環繞,則不要使用算術平均值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM