发现大型数据集中的周期性模式

时间:2010-04-06 01:27:39

标签: algorithm

我在表单中的磁盘上有一大串元组 (t1,k1) (t2,k2) ... (tn,kn)

ti是一个单调递增的时间戳,ki是一个键(如果需要,假设一个固定长度的字符串)。 ti和ki都不保证是独一无二的。然而,独特的tis和kis的数量是巨大的(数百万)。 n本身非常大(1亿+),k的大小(大约500字节)使得无法将所有内容存储在内存中。

我想在此序列中找出定期出现的密钥。

例如,如果我有序列 (1,a) (2,b) (3,c) (4,b) (5,a) (6,b) (7,d) (8,b) (9,a) (10,b)

算法应该发出(a,4)和(b,2)。这是一个周期为4的情况,b发生的周期为2.

如果我构建所有键的哈希并存储每个键的连续时间戳之间的差值的平均值以及它的std偏差,我可能能够通过,并且仅报告具有可接受的键的那些std偏差(理想情况下为0)。但是,每个唯一键需要一个桶,而在实践中,我可能只有很少的真正周期性模式。有更好的方法吗?

5 个答案:

答案 0 :(得分:4)

您可以使用离散autocorrelation来查找句点,然后搜索键。自相关的优点是,它更容易理解离散域中发生的事情,并且您不必担心将键映射到任何东西 - 只需使用两个键的特征函数,当它们相等时为1当它们不相等时为0。

答案 1 :(得分:2)

这或多或少是Fourier transformsFast Fourier Transforms等)被发明的原因。

您实际上是将时间(或某个类似维度)域中的序列转换为frequency domain。这是一个非常古老的问题,早于计算机的应用,并且有关于这个主题的巨大理论体系。另请参阅discrete fourier transform

编辑:您必须以某种方式转换您的值k1,k2,...但是假设这是可行的,这种方法也应该如此。

答案 2 :(得分:0)

  

如果我构建所有键的哈希值   存储差异的平均值   在每个的连续时间戳之间   关键和std偏差相同,我   也许能够通过,而且   只报告有一个   可接受的标准偏差(理想情况下为0)。   但是,每个需要一个桶   独特的关键,而在实践中,我   可能很少有真正的周期性   图案。有更好的方法吗?

就个人而言,我认为除非你能找到问题的更多结构,否则这可能是你得到的最好的。

答案 3 :(得分:0)

让我们将(时间戳,字符串)元组标记为()。 一些限制: 1.有一组离散的,即这些值的周期性出现之间的匹配是准确的:aaabb ... aaabb,而不是aaabb ... aaabc。 2.值的所有实例的集合可以适合存储器。

算法: 1.获取所有唯一值的完整列表 2.对于每个唯一值,获取所有元组,生成有序的时间戳列表。 3.应用算法查找此数据中的模式。理想情况下,非均匀离散傅立叶变换或自相关。

答案 4 :(得分:0)

你真的有两个不同的问题:

  1. 您的数据中有m个不同的信号,由m个唯一键定义。您需要将每个信号和存储分开。

  2. 给定其中一个独特信号,您必须确定它是否是周期性的,这是自相关或离散傅里叶变换的应用,无论您喜欢哪个。例如,DFT为您提供数据的插值周期函数的系数。如果DFT中只有一个系数非零,则有一个明确的周期。

  3. 如果在不分离信号的情况下对数据应用DFT或自相关,则会出现复合问题,您将不知道发现的“周期性”信号之一是由一个或多个独特信号组成。