python - 使用 Python 的 KMeans 算法聚类地理位置坐标(lat,long 对)

标签 python numpy geolocation scipy k-means

使用以下代码对地理位置坐标进行聚类会产生 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/

相关文章:

python - 为什么我得到 "NoneType' 对象没有属性...?

python - 如何将从套接字接收到的图像保留在缓冲区中

python - 如何将长字符串的 numpy 数组转换为仅包含一个元素的列表

python - numpy View 如何知道它引用的值在原始 numpy 数组中的位置?

python - 以概率随机生成numpy中的元素

android - 无法连接到 GoogleAPIClient LocationServices.API

python - Pandas 中的时间分级

javascript - jquery从另一个函数获取变量

safari - 为什么 Coordinates 对象的 heading 属性在 mobile safari 中总是返回 null?

python - 使用 python 和 numpy 加载文件的最快方法是什么?