[英]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.