最近在研究行程时间预测,即从一个点(起点)到另一个点(终点)所需的旅行时间,类似滴滴打车,提交订单后返回的预计到达时间。
看了不少文献,其中一种方法的基本思想是:寻找与查询行程的起点和终点临近的历史行程,取这些历史行程的旅行时间的平均值作为查询行程的预测行程时间。
曾经,我们能获取到的历史行程数据的起点和终点是用GPS经纬度标记的,我们可以通过计算欧氏距离来判断两个点是否临近,而现在我拿到的数据,在轨迹这一块,没有GPS经纬度了,而是一个一个link串联起来表示了轨迹,以下是一个历史行程的完整数据(已经做了标识):
[{'order_id': 5966280.0, 'eta': 531.0, 'dist': 2923.0, 'simple_eta': 495.0, 'driver_id': 75457.0, 'slice_id': 153.0, 'link_id': [157298.0, 511622.0, 524542.0, 97293.0, 273845.0, 556273.0, 73842.0, 101675.0, 325444.0, 134737.0, 611534.0, 47128.0, 29620.0, 204460.0, 436510.0, 332956.0, 324365.0, 83567.0, 61707.0, 624101.0, 470155.0, 153565.0, 141013.0, 218370.0, 430354.0, 47019.0, 491417.0, 195253.0, 438985.0, 590789.0, 585900.0, 593444.0, 168277.0, 192950.0, 540065.0, 326014.0, 154766.0, 337407.0, 320165.0, 238003.0, 314863.0, 30464.0, 439101.0, 397883.0, 340640.0, 263261.0, 483343.0, 520096.0, 299212.0, 271678.0, 427595.0, 440486.0, 160457.0, 45227.0, 527119.0, 541865.0, 449849.0, 215958.0, 22603.0, 597673.0, 191034.0, 507113.0, 554586.0, 631985.0, 487340.0], 'link_time': [4.5, 2.8552, 2.2345, 3.6, 3.2276, 3.7241, 2.4828, 2.4828, 0.7043, 3.6, 15.975, 18.0, 1.98, 15.3818, 6.5872, 4.1727, 2.88, 5.6195, 7.05, 10.2462, 2.1103, 3.4875, 6.03, 3.6, 4.5, 0.8082, 2.475, 7.8545, 15.5415, 6.0585, 1.2, 3.2571, 6.48, 2.9793, 2.5714, 4.4471, 4.08, 1.3263, 1.0667, 21.6, 2.4923, 10.32, 1.3091, 4.8, 7.056, 5.5385, 6.6, 9.6, 8.775, 1.2, 16.4571, 6.96, 8.6824, 2.0348, 4.44, 3.5077, 2.5463, 4.4526, 11.7, 16.0, 2.2737, 1.0286, 0.8571, 1.3714, 9.2842], 'link_ratio': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], 'link_current_status': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], 'link_arrival_status': [0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0], 'cross_start': [47128.0, 624101.0, 30464.0, 160457.0, 597673.0], 'cross_end': [204460.0, 153565.0, 397883.0, 527119.0, 507113.0], 'cross_time': [23.0, 30.0, 26.0, 18.0, 30.0], 'lowtemp': 26, 'hightemp': 28, 'weekday': 5, 'weather': 3}]
“link_id”列表所表示的就是这个行程所经过的所有道路link的序列(原始数据中还有一个文件,记录了某个城市的所有link的编号,比如其中的一条数据“639889 639890,639891,90428,320489”,表示与link“639889”连接的其它四个link)的序列。
我的问题是,在只有link编号的情况下,我如何判断一个link的邻近link,比如上例中,起点link是157298,终点link是487340,我想去历史行程中查找与这一对起终点临近的行程。
找出起点连接的其它点,然后去查询出其它点的历史行程。比如题中给的数据“639889 639890,639891,90428,320489”,起点为639889 ,就去历史行程中找到所有经过639889(包含自身),639890,639891,90428,320489这五个link的轨迹。在刚才找到轨迹里面查找是否包含终点(或与终点相连的点)。找到符合的轨迹差不多就是临近路线。比如说知道轨迹A->B->C->D->F和C->D->E时间,,但是现在起点为B,终点为E。首先找包含B的轨迹,发现有一个,但是这个轨迹没有经过E,就去找E连接的D。发现这个轨迹经过了D。于是结果就是截取A->B->C->D->F中B->C->D这段,C->D->E中D->E这段。两个时间相加就是起点为B,终点为E的时间,同时A->B->C->D->F和C->D->E就是临近路线。
以上是我个人想法,希望可以帮助你。
看你现有的数据的多少了,如果数据量足够就直接放到机器学习模型里面训练,如果不够的话,需要先模拟生成一部分假数据
把你的数据用深度学习,生成对抗网络训练一下呢,尽量模拟多的数据。
可以用catboost 预测下,搞个基准模型,再用深度学习