在python中聚集500,000个地理空间点

时间:2014-06-03 20:38:51

标签: python cluster-analysis geospatial

我目前面临的问题是如何在python中聚集大约500,000个纬度/经度对。到目前为止,我已经尝试用numpy计算距离矩阵(传入scikit-learn DBSCAN),但是如此大的输入会很快发出内存错误。

这些点存储在包含该点的纬度,经度和数据值的元组中。

简而言之,在python中对大量纬度/经度对进行空间聚类的最有效方法是什么?对于这个应用程序,我愿意以速度的名义牺牲一些准确性。

编辑: 要查找的算法的簇数是提前未知的。

2 个答案:

答案 0 :(得分:4)

scikit learn中旧版本的DBSCAN会计算完整的距离矩阵。

不幸的是,计算距离矩阵需要O(n^2)内存,这可能就是你内存不足的地方。

scikit learn的新版本(你使用哪个版本?)应该能够在没有距离矩阵的情况下工作;至少在使用索引时。在500.000个对象中,您想要使用索引加速,因为这会将运行时从O(n^2)减少到O(n log n)

我不知道scikit学习如何支持其索引中的大地距离ELKI是我所知道的唯一可以使用R * -tree索引来加速大地距离的工具;使这项任务非常快(特别是在批量加载索引时)。你应该试一试。

查看Scikit learn indexing documentation,然后尝试设置algorithm='ball_tree'

答案 1 :(得分:2)

我没有你的数据所以我只是将三十五个随机数生成三列。

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

arr = np.random.randn(500000*3).reshape((500000, 3))
x, y = kmeans2(whiten(arr), 7, iter = 20)  #<--- I randomly picked 7 clusters
plt.scatter(arr[:,0], arr[:,1], c=y, alpha=0.33333);

out[1]:

enter image description here

我计时了,运行这个Kmeans2花了1.96秒,所以我不认为它与你的数据大小有关。将您的数据放入500000 x 3 numpy数组并尝试kmeans2。