【问题标题】:Discover periodic patterns in a large data-set在大型数据集中发现周期性模式
【发布时间】:2010-04-07 01:29:58
【问题描述】:

我在磁盘上有大量元组序列,格式为 (t1, k1) (t2, k2) ... (tn, kn)

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

我想找出这个序列中键的周期性出现。

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

算法应该发出 (a, 4) 和 (b, 2)。即 a 出现周期为 4,b 出现周期为 2。

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

【问题讨论】:

  • 如果 ti 单调递增,它们不是唯一的吗?
  • 单调递增函数是非递减的。在这种情况下,这意味着 t(i)

标签: algorithm


【解决方案1】:

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

【讨论】:

  • 与 Rob 的评论相同 - 如果数据不是均匀采样的,那么很多传统的离散 DSP 技术都不适用。
【解决方案2】:

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

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

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

【讨论】:

  • 注意,数据不一定是均匀采样的(我们只知道时间戳是单调递增的),所以FFT等常用技术在这里可能不适用。
  • 对于时间轴上不均匀的数据,您可以将它们分箱并平均分箱中的值,然后对分箱数据进行 FFT。不幸的是,看起来他的 K 是离散值,而不是正常的变化信号。
  • FFT 分析非常有限,正如 Paul R 所说。 phkahler,您是对的,您可以分箱并进行加权 FFT,但如果您的分箱非常稀疏,您的 FFT 将包含很少的信息。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    让我们将 (timestamp,string) 元组标记为 (key,value)。 一些限制: 1. 有一组离散的,即这些值的周期性出现之间的匹配是精确的:aaabb ... aaabb,而不是 aaabb ... aaabc。 2. 一个值的所有实例的集合可以放入内存中。

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

    【讨论】:

      【解决方案5】:

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

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

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

      如果您在不分离信号的情况下对数据应用 DFT 或自相关,您将遇到一个复杂的问题,您将无法知道找到的“周期性”信号之一是由一个独特的信号还是由几个独特的信号组成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 2018-09-29
        • 2021-01-14
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 2013-04-17
        相关资源
        最近更新 更多