python - 与 Pandas 组合 GPS 点
问题描述
我有一个 Pandas 塔数据框,例如:
site lat lon
18ALOP01 11.1278 14.3578
18ALOP02 11.1278 14.3578
18ALOP12 11.1288 14.3575
18PENO01 11.1580 14.2898
如果它们太近(50m),我需要将它们分组。然后,我制作了一个执行“自交叉连接”的脚本,计算所有站点组合之间的距离,并为距离小于阈值的站点设置相同的 id。所以,如果我有 n 个站点,它会计算(n^2) - n
组合,那么,这是一个糟糕的算法。有没有更好的方法来做到这一点?
解决方案
假设站点的数量和“真实”位置未知,您可以尝试MeanShift聚类算法。虽然这是一种通用算法并且不具有高度可扩展性,但它会比在 python 中实现自己的聚类算法更快,并且您可以尝试bin_seeding=True
作为优化,如果将数据点分箱到网格中是修剪起始点的可接受的捷径种子。(注意:如果将数据点合并到网格中,而不是计算点之间的欧几里得距离,是一种可接受的“完整”解决方案,那么这似乎是解决问题的最快方法。)
这是 scikit-learn 实现 MeanShift 的示例,其中 x/y 坐标以米为单位,算法创建半径为 50m 的集群。
In [2]: from sklearn.cluster import MeanShift
In [3]: import numpy as np
In [4]: X = np.array([
...: [0, 1], [51, 1], [100, 1], [151, 1],
...: ])
In [5]: clustering = MeanShift(bandwidth=50).fit(X) # OR speed up with bin_seeding=True
In [6]: print(clustering.labels_)
[1 0 0 2]
In [7]: print(clustering.cluster_centers_)
[[ 75.5 1. ]
[ 0. 1. ]
[151. 1. ]]
推荐阅读
- node.js - Google App Engine 正在运行旧的“npm start”脚本
- json - JQ:执行令牌替换
- mysql - 运行保存在字段中的 SQL 查询
- sql - 如何将密码存储在需要以纯文本形式恢复的数据库中?
- azure - 集群自动缩放器未使用 ACS-Engine 在 Azure 上从 0 扩展
- c# - 不使用 GetVisualChild 从 DataGrid 获取单元格值
- php - 覆盖 Notifiable Trait Laravel 上的“email”属性
- sql-server - SQL Server:选择不同的日期加上条件和计数
- parallel-processing - 如何禁用可能卡在 MPI 中的进程
- reactjs - Material-UI Core TextField 全局设置 InputLabelProps 收缩