(空间稀疏)空间时间序列的有效表示

计算科学 复杂 数据集 网格 数据结构 最近邻
2021-11-27 07:11:47

背景

我有一个巨大的数据集,由点(在平面上)以及每个点的时间戳组成。这是汽车 GPS 测量的集合,为我们提供了某些汽车的位置(纬度/经度)以及该汽车在那里的时间。

我想将时间序列的信息存储在网格上。也就是说,我有一个矩形网格,对于每个单元格,我想要一个单元格中有 GPS 信号的日期列表。所以,最后我希望数据是一个 2 x 2 的列表矩阵。矩阵的每个元素表示网格的一个单元格和附加的列表将包含该单元格中存在信号的日期。

这将是我必须执行的时间序列分析的理想数据表示。

问题

数据集很大。所以我想提高内存效率。要考虑的要点如下:

  • 由于我使用的是常规矩形网格,并且 GPS 信号仅限于包含道路的单元格,因此大多数单元格将“未激活”,即矩阵的大部分元素将存储一个空列表(无信号)。

试图

上述说明表明空间信息可以存储在列表中,而不是矩阵中。
我们将遍历数据集,对于每个度量,查看列表中是否已存在相应的单元格,如果不存在,则将新单元格添加到激活的单元格列表中。

与基于矩阵的方法相比,这种方法有两个缺点:

  1. 计算开销:对于每个数据点,我们必须搜索整个列表以确定它所属的单元格是否已经在列表中。在矩阵方法中,我们可以很容易地确定相应元素的索引,给定点的坐标和网格的分辨率。

  2. 空间信息丢失:在矩阵方法中,很容易改变网格的分辨率,或者执行基于最近邻的操作。列表方法完全转储所有空间信息。

在这两种情况下,矩阵方法都具有复杂度,而列表方法具有复杂度。O(1)O(n)

因此,我希望能够找到一种不需要存储空单元格的表示,同时保留矩阵表示的优点。


PS:我知道kdTrees对最近邻搜索很有用,我只是有点担心构建它所需的时间。注释?

2个回答

数据集很大。所以我想提高内存效率。要考虑的要点如下:

  • […] 大多数单元格将“未激活”,即矩阵的大部分元素将存储一个空列表(无信号)。

这听起来好像一个列表数组(或可变大小的数组)就可以了。在这种情况下,内存存储的关键因素不是数据集的大小,而是网格的大小:并非所有列表都需要具有相同的长度。事实上,你必须为一个空的网格点存储一个空指针。

当然,如果您的网格太大以至于您甚至无法存储相应数量的空指针,那么您确实有问题。

您应该定义要执行的最近邻操作,并大致估计数据集的大小。

在数据结构方面,您还可以考虑使用带有空间哈希函数的哈希表。假设您使用常规网格表示事物,您可以轻松创建散列函数并开发高效的搜索结构,同时还以稀疏方式表示事物。使用这种数据结构,它应该遍历你的条数据并将它们放入搜索结构中,这样你就可以根据它们的网格单元轻松地搜索它们。根据您正在执行的最近邻操作,这种哈希表方法可能仍然足够。O(1)n

对于 KD 树,它们需要一些时间来构建,但它们通常非常快(尽管显然数据集的大小确实会影响这一点)。假设您的数据集没有改变,您还可以将排序后的 KD Tree 存储到内存中,然后直接读取。的数量级上搜索最近的邻居可能非常有效O(log(n))