Python: XCORR的解释

7 投票
1 回答
8922 浏览
提问于 2025-04-18 10:56

我有一个关于Python中xcorr的问题。假设我做了以下操作:

output=plt.xcorr(x,y, maxlags=4)

那么,哪个时间序列是滞后的呢?输出结果将是x和y在时间t= -4到+4之间的互相关系。那么这个输出是指x和y之间的互相关系吗?如下图所示:

enter image description here

还是说是x和y之间的反向关系呢?我试着深入了解xcorr的代码,以便更好地理解(可以查看这里),但我有点迷糊……np.correlate(x,y,mode = 2)。mode = 2是什么意思呢?我只看到这里提到的模式是validfullsame

1 个回答

10

mode 参数决定了在边界附近会发生什么。如果你有两个输入向量,长度分别为 x 和 y(x > y):

  • valid / 0: 你只会得到两个信号重叠部分的卷积结果(x-y+1 个点)
  • same / 1: 输出向量的长度和较长的输入向量长度相同(x 个点)
  • full / 2: 包含所有数据,只要信号之间有一个样本重叠(x+y-1 个点)

这些模式的数字定义并不太公开,但可以在 numpy 的源代码中找到。无论如何,xcorr 使用的是 full 模式。(实际上,在给 convolvecorrelate 指定模式时,只需要模式名称的首字母。)

关于这些函数的实际作用,有些混淆。numpy.correlate 根据 numpy 的版本有两种不同的行为。在内部,这两种行为被称为 multiarray.correlate(旧版)和 multiarray.correlate2(新版)。numpy.convolve 会反转第二个输入向量,然后使用 multiarray.correlate(即被弃用的用于相关性计算的那个)。

所以,如果你想确认一下,最好是测试一下实际效果。基本功能是两个向量之间的乘积,向量每次移动一个位置。为了更清楚,我会用两个向量的数字例子来说明。

a <= [1,2,3,4,5]
b <= [10,20]

我们先来看一下卷积:

numpy.convolve(a,b,mode='full') => [ 10, 40, 70, 100, 230, 100]

这是因为:

    1  2  3  4  5  => 1 x 10 = 10
20 10

    1  2  3  4  5  => 1 x 20 + 2 x 10 = 40
   20 10

...

    1  2  3  4  5     => 5 x 20 = 100
               20 10

不同的模式返回相同的数据,但在每个端点处被截断。

对于相关性:

numpy.correlate(a,b,mode='full') => [ 20, 50, 80, 110, 140, 50]

    1  2  3  4  5  => 1 x 20 = 20
10 20

    1  2  3  4  5  => 1 x 10 + 2 x 20 = 50
   10 20

...

    1  2  3  4  5     => 5 x 10 = 100
               10 20

所以,基本上唯一的区别是其中一个向量是镜像的。这会带来一些后果,比如卷积在 ab 交换时结果相同,而相关性在这种情况下结果会反转。对于复数,correlate 在进行上述计算之前会对第二个向量进行共轭处理。


回到 matplotlibxcorr 图表。它接收两个长度相等的向量 xy,并计算这两个向量在不同滞后下的互相关。

它首先计算 xy 之间的完整卷积,使用 numpy.correlate,如上所示。然后,它从完整输出向量中在位置 -maxlagsmaxlags 之间绘制相关性结果。规则是第二个输入向量会被移动。在最左边的图表位置,第二个向量 y 处于最左边的位置(即相对于 x 向左移动)。

检查这一点的最简单方法可能是:

xcorr([1.,2.,3.,4.,5.], [0,0,0,0,1.], normed=False, maxlags=4)

撰写回答