rok*_*rok 8 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()
Run Code Online (Sandbox Code Playgroud)
使用Kmeans进行位置聚类是否正确,因为它使用欧几里德距离而非使用Haversine公式作为距离函数?
由于您的意思,k-means不是用于空间聚类的好算法.相反,您可以使用scikit-learn的DBSCAN和hasrsine metric and ball-tree算法来完成此聚类工作.
本教程演示了使用DBSCAN/hasrsine对纬度 - 经度空间数据进行聚类,并避免了所有这些欧几里德距离问题:
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))
Run Code Online (Sandbox Code Playgroud)
请注意,这特别使用了scikit-learn v0.15,因为一些早期/后期版本似乎需要计算全距离矩阵.另请注意,eps值以弧度表示,而.fit()以半径为单位获取半正弦度量的坐标.
归档时间: |
|
查看次数: |
15824 次 |
最近记录: |