使用以下代码将地理位置坐标分为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和haversine metric和ball tree算法来完成这个集群工作。
本教程使用DBSCAN/haversine演示clustering latitude-longitude spatial data,并避免了所有这些欧几里德距离问题:
注意,这特别使用scikit learn v0.15,因为一些早期/后期版本似乎需要计算完整的距离矩阵。还要注意,eps值是以弧度为单位的,.fit()接受haversine度量的以弧度为单位的坐标。
这在很大程度上取决于您的应用程序:
如果您真的需要Haversine公式,您可能需要研究this讨论。正如Anony Mousse所说:
相关问题 更多 >
编程相关推荐