0

所以我有两个不同的文件,其中包含一个正方形地图(512x512 像素)中的多个轨迹。每个文件都包含有关每个粒子在轨迹/轨迹(X 和 Y 坐标)内的空间位置以及该点所属的轨迹/轨迹 (TRACK_ID) 的信息。我的目标是找到一种方法在两个文件之间聚集相似的轨迹。我找到了一个很好的方法(距离聚类比较),但是代码太慢了。我只是想知道是否有人有一些建议可以让它更快。

我的文件看起来像这样:

在此处输入图像描述

我实施的方法根据称为 Fréchet 距离的东西(可能与此处无关)找到了类似的轨迹。您可以在下面找到我编写的函数,但简而言之,这是基本原理:

  • pandas.groupby使用file1 ( growth_xml) 和 file2 ( shrinkage_xml)的函数按轨道对所有点进行分组
  • 对于growth_xml(循环)中的每个轨迹,我与中的每个轨迹进行比较growth_xml
  • 如果他们通过了我定义的 Fréchet 距离标准(一个 if 语句),我将两个轨道都保存在一个新表中。您可以看到我调用的附加过滤条件delay,但我想在这里解释并不重要。

非常简单:

def distance_clustering(growth_xml,shrinkage_xml):

coords_g = pd.DataFrame() # empty dataframes to save filtered tracks
coords_s = pd.DataFrame()

counter = 0  #initalize counter to count number of filtered tracks

for track_g, param_g in growth_xml.groupby('TRACK_ID'):

    # define growing track as multi-point line object 
    traj1 = [(x,y) for x,y in zip(param_g.POSITION_X.values, param_g.POSITION_Y.values)]

    for track_s, param_s in shrinkage_xml.groupby('TRACK_ID'):

        # define shrinking track as a second multi-point line object 
        traj2 = [(x,y) for x,y in zip(param_s.POSITION_X.values, param_s.POSITION_Y.values)]

        # compute delay between shrinkage and growing ends to use as an extra filter
        delay = (param_s.FRAME.iloc[0] - param_g.FRAME.iloc[0])

        # keep track only if the frechet Distance is lower than 0.2 microns

        if frechetDist(traj1, traj2) < 0.2 and delay > 0:

            counter += 1

            param_g = param_g.assign(NEW_ID = np.ones(param_g.shape[0]) * counter)
            coords_g = pd.concat([coords_g, param_g])

            param_s = param_s.assign(NEW_ID = np.ones(param_s.shape[0]) * counter)
            coords_s = pd.concat([coords_s, param_s])

coords_g.reset_index(drop = True, inplace = True)
coords_s.reset_index(drop = True, inplace = True)
return coords_g, coords_s

主要问题是大多数时候我有超过 2000 首曲目(!!),而且这种成对组合需要很长时间。我想知道是否有一种简单有效的方法来做到这一点。也许通过在多个小区域而不是整个地图中进行成对组合?没有把握...

4

1 回答 1

0

您是否尝试为成对组合距离制作矩阵 (DeltaX,DeltaY) lookUpTable。计算一次 LUT 需要很长时间,或者您可以将其写入文件并在算法启动时加载。然后,您只需查看正确的大小写即可获得结果,而不是每次都进行计算。

您也可以对距离计算进行多项式回归,它会不太精确,但肯定会更快

于 2020-03-29T21:00:05.670 回答