Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python对500000个地理空间点进行聚类_Python_Cluster Analysis_Geospatial - Fatal编程技术网

用python对500000个地理空间点进行聚类

用python对500000个地理空间点进行聚类,python,cluster-analysis,geospatial,Python,Cluster Analysis,Geospatial,我目前面临的问题是如何在python中找到一种聚集500000个纬度/经度对的方法。到目前为止,我已经尝试使用numpy计算距离矩阵(传递到scikit learn DBSCAN中),但是使用如此大的输入,它很快就会抛出一个内存错误 这些点存储在元组中,元组包含纬度、经度和该点的数据值 简而言之,在python中对大量纬度/经度对进行空间集群的最有效方法是什么?对于这个应用程序,我愿意以速度的名义牺牲一些准确性 编辑: 算法要查找的群集数在时间之前是未知的。我没有您的数据,所以我只是将500k个

我目前面临的问题是如何在python中找到一种聚集500000个纬度/经度对的方法。到目前为止,我已经尝试使用numpy计算距离矩阵(传递到scikit learn DBSCAN中),但是使用如此大的输入,它很快就会抛出一个内存错误

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

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

编辑:
算法要查找的群集数在时间之前是未知的。

我没有您的数据,所以我只是将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均值。地球不是平的。