我有一个关于python中xcorr的问题。假设我执行以下操作:

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

哪个时间序列滞后?输出将是在时间t=4到+4之间x和y之间的互相关。输出是指X和Y之间的互相关吗?以下内容:
或者是X和Y之间的反方向?
我试图深入研究xcorr的代码以获得更好的想法(参见here),但我有点迷失了……相关(x,y,模式=2)。模式=2是什么意思?我只看到here模式是=validfullsame

最佳答案

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图表。它接收两个向量“cc>和x等长度,并计算这些向量在不同滞后下的互相关。
它首先计算ynumpy.correlatex之间的全卷积,如上图所示。然后从y位置的完整输出向量中绘制相关结果。规则是第二个输入向量移位。在最左边的图形位置,第二个向量-maxlags位于最左边的位置(即从maxlags向左移动)。
最简单的检查方法可能是:
xcorr([1.,2.,3.,4.,5.], [0,0,0,0,1.], normed=False, maxlags=4)

10-01 19:47