我在Python中有xcorr的问题。假设我执行以下操作:
output=plt.xcorr(x,y, maxlags=4)
哪个时间序列滞后?输出将是时间 t = -4到+4时x和y之间的互相关。那么输出是指x和y之间的互相关,如下所示:
或者它是x和y之间的反转?
我试图深入研究xcorr的代码以获得更好的想法(参见here)但我有点迷失... np.correlate(x,y,mode = 2)。 mode = 2是什么意思?我只看到here模式为= valid
,full
或same
。
答案 0 :(得分:8)
mode
参数确定边界附近发生的事情。如果您有长度为x和y(x> y)的输入向量:
valid
/ 0:你只会收到两个信号重叠的卷积部分(x-y + 1个点)same
/ 1:输出向量的长度与较长输入向量的长度相同(x点)full
/ 2:来自信号之间甚至只有一个重叠样本的区域的所有数据(x + y-1分)这些模式的数字并非公开定义,可以在numpy
的源代码中找到。在任何情况下,xcorr
都使用full
模式。 (实际上,在为convolve
或correlate
提供模式时,只有模式名称的第一个字母才有意义。)
对于这些功能的真正作用存在一些混淆。根据{{1}}版本,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
和a
,则卷积会给出相同的结果,在这种情况下,相关性会产生相反的结果。复数b
在上面的计算之前将第二个向量共轭。
返回correlate
的{{1}}图表。它接收两个长度相等的向量matplotlib
和xcorr
,并计算这些向量在不同滞后时的互相关性。
首先计算x
和y
之间numpy.correlate
的完整卷积,如上所示。然后,它从位置x
.. y
处的完整输出向量绘制相关结果。规则是第二个输入向量被移位。在最左边的图形位置,第二个向量-maxlags
位于其最左侧位置(即从maxlags
向左移动)。
检查此问题的最简单方法可能是:
y