用python对500000个地理空间点进行聚类
我目前面临的问题是如何在python中找到一种聚集500000个纬度/经度对的方法。到目前为止,我已经尝试使用numpy计算距离矩阵(传递到scikit learn DBSCAN中),但是使用如此大的输入,它很快就会抛出一个内存错误 这些点存储在元组中,元组包含纬度、经度和该点的数据值 简而言之,在python中对大量纬度/经度对进行空间集群的最有效方法是什么?对于这个应用程序,我愿意以速度的名义牺牲一些准确性 编辑:用python对500000个地理空间点进行聚类,python,cluster-analysis,geospatial,Python,Cluster Analysis,Geospatial,我目前面临的问题是如何在python中找到一种聚集500000个纬度/经度对的方法。到目前为止,我已经尝试使用numpy计算距离矩阵(传递到scikit learn DBSCAN中),但是使用如此大的输入,它很快就会抛出一个内存错误 这些点存储在元组中,元组包含纬度、经度和该点的数据值 简而言之,在python中对大量纬度/经度对进行空间集群的最有效方法是什么?对于这个应用程序,我愿意以速度的名义牺牲一些准确性 编辑: 算法要查找的群集数在时间之前是未知的。我没有您的数据,所以我只是将500k个
算法要查找的群集数在时间之前是未知的。我没有您的数据,所以我只是将500k个随机数生成三列
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]:
将numpy导入为np
将matplotlib.pyplot作为plt导入
从scipy.cluster.vq导入kmeans2,变白
arr=np.random.randn(500000*3).重塑((500000,3))
x、 y=kmeans2(whiten(arr),7,iter=20)#scikit learn中旧版本的DBSCAN将计算完整的距离矩阵
不幸的是,计算距离矩阵需要O(n^2)
内存,这可能就是内存不足的地方
较新版本(您使用哪个版本?)的scikit learn应该能够在没有距离矩阵的情况下工作;至少在使用索引时。对于500.000个对象,您确实希望使用索引加速,因为这将运行时从O(n^2)
减少到O(n log n)
我不知道scikit learn在其索引中对大地距离的支持程度如何。是我所知道的唯一可以使用R*树索引来加速大地测量距离的工具;使此任务的速度非常快(特别是在批量加载索引时)。你应该试一试
请查看,然后尝试设置算法='ball\u tree'
?如果你想尝试这种方法,有一个库是存在的。也许我表现出无知,但你的标准是集群的数量吗?(还有snide comment,如果您将簇数设置为1,则有一个O(1)算法来执行此操作)K means算法要求您将要查找的簇数作为算法的参数,而不是DBSCAN或OPTICS,后者根据其他标准确定簇。另外,虽然O(1)几乎是值得的,但不幸的是,在北极和南极之间通常有不止一个云系统哈哈。在运行之前,你能想出任何方法在不知道集群数量的情况下实现这一点吗?不幸的是,这是我们数据的问题之一。您也不需要提前知道集群的数量。但是你必须指定你想要多少。我会尝试不同的值,然后画出结果,看看什么k最适合。如果你愿意,我可以编辑答案以包含一个绘图。如果我不必重复这个过程100000多次,这将是一个理想的解决方案。就目前的情况而言,也许我可以找到某种方法,通过算法找到最优k。非常感谢。不要对纬度、经度数据使用k均值。地球不是平的。