四维时空数据(x,y,z,时间)是否适合使用kd树?

8
我想使用一种数据结构来对时空数据(x、y、z和时间)进行排序。
目前,处理算法搜索一组4D(x、y、z、时间)点,给定一个球形(3d)空间半径和一个线性(1d)时间半径,标记每个点,在这些半径内的其他点。原因是在处理后,我可以在O(1)时间内询问任何4D点的所有邻居。
然而,在某些常见的空间和时间半径配置中,算法的第一次运行需要大约12小时。信不信由你,这实际上比我们行业中存在的情况要快。尽管如此,我还是想帮助加速初始运行,所以我想知道:kd-tree是否适用于4D时空数据?
请注意,我寻找最近邻搜索或k最近邻搜索的实现。
更多信息:
一个示例数据集有450,000个4D点。
一些数据集是时间密集的,因此按时间排序确实节省了处理时间,但仍会导致许多距离检查。
时间以类似于Excel的日期表示,典型范围在30,000-39,000之间(大约)。空间范围有时是较高的值,有时是较低的值,但每个空间坐标之间的范围与时间类似(例如maxX-minX ~ maxT-minT)。
更多信息:
我想添加一些稍微不相关的数据,以防任何人处理过类似的数据集。
基本上,我正在处理表示由多个传感器记录和协作的时空事件的数据。涉及误差,因此仅包括满足误差阈值的事件。
这些数据集的时间跨度范围在5-20年之间。
对于非常旧的数据(> 8年),事件通常在空间上非常密集,原因有两个:1)当时相对较少的传感器可用,2)传感器彼此靠近,以便可以用较低的误差适当地协作附近的事件。可以记录更多事件,但它们的误差太高。
对于新的数据(<8年),事件通常在时间上非常密集,原因相反:1)通常有许多传感器可用,2)传感器以较大的距离定期间隔放置。
因此,数据集通常不能仅被称为时间密集或空间密集(除了仅包含新数据的数据集)。
结论
我显然应该在这个网站上问更多的问题。
接下来我将测试几种解决方案,包括4D kd树、3D kd树后跟时间距离检查(由Drew Hall建议),以及我目前拥有的算法。此外,我还被建议使用另一种数据结构,称为TSP(时间空间分区)树,它使用八叉树进行空间分区,并在每个节点上使用BSP进行时间分区,因此我也可能会测试它。
假设我记得,我一定会发布一些关于不同时间/空间半径配置的性能基准测试。
谢谢大家。
4个回答

7
为了更详细地解释我的上面的一个回答,根据文献,kd 树需要具有欧几里得坐标的数据。它们可能不是严格必要的,但它们肯定是足够的:保证所有坐标都是欧几里得的,确保适用空间的正常规则,并使得可以轻松地按照它们的位置分割点并建立树结构。
时间有些奇怪。在特殊相对论的规则下,当您使用时间坐标时,您使用闵氏度量而不是标准欧几里得度量。这会导致各种问题(其中最严重的是破坏“同时性”的含义),通常让人们害怕时间坐标。然而,这种恐惧是没有根据的,因为除非你知道你正在处理物理学,否则你的时间坐标实际上几乎肯定是欧几里得的。
什么是欧几里得坐标?它应该独立于所有其他坐标。说时间是欧几里得坐标意味着您只需查看它们的时间坐标并忽略任何额外信息就可以回答“这两个点在时间上是否靠近?”的问题。很容易看出,如果两个点的时间坐标可以截然不同但仍被认为是“在时间上靠近的”,那么按照它们的坐标值进行分割点方案的树将无法很好地工作。
欧几里得时间坐标的示例是任何以单个一致时区(如 UTC 时间)指定的时间。如果你有两个时钟,一个在纽约,一个在东京,你知道如果你有两个标记为“12:00 UTC”的测量,那么它们是在同一时间进行的。但如果是用本地时间进行测量,那么一个是“12:00 纽约时间”,另一个是“12:00 东京时间”,你必须使用关于城市位置和时区的额外信息来计算两个测量之间经过了多长时间。
因此,只要您的时间坐标是一致测量且合理的,它就是欧几里得的,这意味着它在 kd 树或类似的数据结构中完全正常工作。

1

你提供的信息不足以回答这个问题。

但是,总的来说,如果空间(或在您的情况下是时空)分布适合kd-tree分解,那么kd-tree通常非常适用于4(或5或6或...)维数据集。换句话说,它取决于具体情况(听起来熟悉吗?)。

kd-tree只是一种空间分解方法,适用于某些局部搜索。当您进入更高的维度时,维数灾难问题会出现,但是4d还好(您可能需要至少几百个点)。

为了知道这是否适用于您,您必须分析其他标准。近似最近邻搜索是否足够好(这可以帮助很多)。树平衡是否可能很昂贵等。


这是一个随着时间增长而增加的数据集。目前其中一个数据集有450,000个4D点,因此我怀疑这些数据集的诅咒是可以忽略不计的。kd-tree问题涉及到有人说你不能使用欧几里得距离混合欧几里得和非欧几里得坐标。老实说,在这种情况下,我不知道时间是否被认为是欧几里得的。 - user44484
1
所以你在时间坐标上没有做任何特殊或奇怪的事情。这意味着它应该作为kd树的一部分正常工作。 - kquinn
1
如果时间是欧几里得坐标,那意味着它实际上并不特殊。它只是您的数据的另一个维度,与其他维度正交。这意味着所有通常的规则都适用。当时间不是真正独立的坐标时,事情开始变得混乱,通常的规则和假设就不再适用(例如,在闵可夫斯基度量下,“同时性”的概念完全不同!)。让一个坐标按照不同的规则运作会使分区变得困难。 - kquinn
2
是的,那是一个好总结。重要的部分是距离函数;你何时认为两个点在时间上“接近”?如果你只需要查看时间坐标来回答这个问题,时间就是欧几里得坐标系。如果,比如说,你记录了分布在地球上的传感器的当地时间,那将是非欧几里得的(也是非理智的),因为纽约和东京的中午并不相同,你必须考虑城市的位置来提取有用的时间坐标。 - kquinn
这里有一些好的观点,很高兴我的评论能够引发讨论,即使我无法参与其中。 - simon
显示剩余5条评论

1

如果您在时间维度上存储了指向您的点的索引,那么您是否可以首先在一维时间维度上执行初始修剪,从而减少距离计算的数量?(或者这是一种过度简化的说法吗?)


实际上,这就是算法目前的工作方式。数据按时间维度排序,因此我们可以在按时间顺序遍历时进行修剪。话虽如此,数据有时会非常密集,导致我们需要进行更多的距离计算 :/ - user44484
我正确地得出结论,要搜索的超体不是一个超球体,而是一个“超圆柱体”(每端都有3D球形盖)。 - Svante
我不太清楚。请查看我的更新,其中包含数据的描述,希望这有所帮助。 - user44484

1
如果您的数据相对时间密集(且相对空间稀疏),最好使用三维kd树处理空间维度,然后简单地拒绝超出感兴趣时间窗口的点。这样可以解决混合空间/时间度量问题,但会牺牲稍微复杂的点结构。

我很可能也会测试这个选项。如果能够发现在kd树中进行快速查找,然后再进行一维时间距离检查比当前实现更快,那将是非常棒的事情。目前的实现方式正好相反:优化的时间查找后面跟着昂贵的三维距离检查(尽管在距离检查之前我也有一个盒子修剪)。 - user44484

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接