使用以下代码对地理位置坐标进行聚类会产生 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 进行位置聚类是否正确,因为它使用 Euclidean distance而不是 Haversine formula作为距离函数?
最佳答案
出于您提到的原因,k-means 不是用于空间聚类的好算法。相反,您可以使用 scikit-learn 的 DBSCAN 以及半正弦度量和球树算法来完成此聚类作业。
本教程演示了 clustering latitude-longitude spatial data使用 DBSCAN/haversine 并避免所有这些欧氏距离问题:
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() 采用半正弦度量的以弧度为单位的坐标。
关于python - 使用 Python 的 KMeans 算法聚类地理位置坐标(lat,long 对),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24762435/