如何使用 numpy.correlate 进行自相关?

新手上路,请多包涵

我需要对一组数字进行自相关,据我了解,这只是该组与自身的相关性。

我已经使用 numpy 的相关函数进行了尝试,但我不相信结果,因为它几乎总是给出第一个数字 不是 最大的向量,而它应该是最大的。

所以,这个问题实际上是两个问题:

  1. numpy.correlate 究竟在做什么?
  2. 我如何使用它(或其他东西)进行自相关?

原文由 Ben 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 884
2 个回答

要回答您的第一个问题, numpy.correlate(a, v, mode) 正在执行 --- 与 a 的反向 v 并给出按指定模式裁剪的结果。 卷积的定义,C(t)=∑ -∞ < i < ∞ a i v t+i其中 -∞ < t < ∞,允许从 -∞ 到 ∞ 的结果,但是你显然不能存储无限长的大批。所以它必须被裁剪,这就是模式的来源。有 3 种不同的模式:完整、相同和有效:

  • “完整”模式返回每个 t 的结果,其中 av 有一些重叠。
  • “相同”模式返回与最短向量长度相同的结果( av )。
  • “有效”模式仅在 av 完全重叠时返回结果。 numpy.convolve文档 提供了有关模式的更多详细信息。

对于你的第二个问题,我认为 numpy.correlate 给了你自相关,它 给了你更多一点。自相关用于查找信号或函数在特定时间差下与其自身的相似程度。在时间差为 0 时,自相关应该是最高的,因为信号与其自身相同,因此您预计自相关结果数组中的第一个元素将是最大的。但是,相关性并非从 0 的时间差开始。它从负时间差开始,接近 0,然后变为正。也就是说,您期望:

自相关 (a) = ∑ -∞ < i < ∞ a i v t+i其中 0 <= t < ∞

但是你得到的是:

自相关 (a) = ∑ -∞ < i < ∞ a i v t+i其中 -∞ < t < ∞

您需要做的是获取相关结果的后半部分,这应该是您正在寻找的自相关。一个简单的 python 函数可以做到这一点:

 def autocorr(x):
    result = numpy.correlate(x, x, mode='full')
    return result[result.size/2:]

当然,您需要进行错误检查以确保 x 实际上是一维数组。此外,这种解释可能不是最严格的数学解释。我一直在抛出无穷大,因为卷积的定义使用了它们,但这不一定适用于自相关。所以,这个解释的理论部分可能有点靠不住,但希望实际结果能有所帮助。 这些 关于自相关的 页面 非常有用,如果您不介意在符号和沉重的概念中费力的话,它们可以为您提供更好的理论背景。

原文由 A. Levy 发布,翻译遵循 CC BY-SA 3.0 许可协议

自相关有两个版本:统计和卷积。除了一个小细节外,它们都做同样的事情:统计版本被标准化为区间 [-1,1]。这是您如何进行统计的示例:

 def acf(x, length=20):
    return numpy.array([1]+[numpy.corrcoef(x[:-i], x[i:])[0,1]  \
        for i in range(1, length)])

原文由 jonathf 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题