我有一堆积分[ID,lat,lon,time],但时间不可靠。几个点的时间经常混淆,并且存在一些巨大的差距。我希望能够从这些点计算一个轨道(基本上只是一个线性拟合或polyfit),但我正在努力使它们达到某种顺序。
首先,我尝试通过lat / lon进行排序,这适用于轨道在一个方向上不断移动的情况。当轨道重新开启时,存在各种不匹配和问题。
也许这是一个旅行推销员的问题但在这种情况下我不知道对象的轨道开始/结束的位置。
我考虑过随机选择一个点并前往下一个最近的点并重复;但如果我的随机点在中间并且点之间通常存在较大的间隙,我将如何完成轨道。
GPS points, incorrectly placed into tracks
这是一些GPS点的图片,按ID进行颜色编码。我按[lat,lon]对点进行了排序,你可以看到蓝色轨迹有问题。
这是如此简单,手动做,只是加入点,但我不能计算出来。我正在使用python / numpy / pandas,并且有数百万这些点,所以避免计算密集的方法会有所帮助,但此时我只是被卡住了。
编辑: 好的,所以这不是那么简单。它可能涉及编写粒子/卡尔曼滤波器或者某种哈密顿成本方程,然后迭代整个该死的轨道以获得最佳解决方案。最好的(对我来说最不起作用)解决方案是尝试纠正垃圾时间字段,并可能从点段的平均方位构建统计猜测器。
编辑+解决方案: 好的,所以这并不复杂。我正在观察物体的数据通常以很小的偏差行进N-S或E-W。在存在复杂机动的情况下,我通常拥有更可靠的时间数据。我的数据集的非通用解决方案是检查轨道是否可以定义为纬度的函数(没有S-N运动分量的N-S行程),否则它可以是经度的函数。然后按lat / lon和bam命令。这在螺旋或其他复杂轨道的情况下不起作用,但在我的数据中这些是最小的。
不是完美的解决方案,但对我来说足够好。
答案 0 :(得分:0)
嗯,看似简单的聚类 - 甚至用正确的指标排序都可以解决问题。
from IPython.display import Image
Image('http://i.stack.imgur.com/76pNx.png')
import numpy as np
np.random.seed(42)
data_lat = np.arange(300, dtype=np.int32) * (1 + (np.random.random(300) - 0.5) * 0.1)
data_lon = np.arange(5, 305, dtype=np.int32) * (1 + (np.random.random(300) - 0.5) * 0.1)
%pylab inline
import seaborn as sns
plt.scatter(data_lat, data_lon)
import itertools
seq_data = [(la, lo) for i, (la, lo) in enumerate(zip(data_lat, data_lon)) if
i in itertools.chain(range(20), range(55, 70), range(120, 165),
range(200, 250), range(280, 300))]
plt.plot(*zip(*seq_data))
plt.scatter(*zip(*seq_data))
import random
random.seed(42)
data = seq_data.copy()
random.shuffle(data)
plt.plot(*zip(*data))
plt.scatter(*zip(*data))
data.sort(key=lambda t: (t[0]**2 + t[1]**2)**(1/2))
plt.plot(*zip(*data))
plt.scatter(*zip(*data))