【问题标题】:Find the best lag from the numpy.correlate output从 numpy.correlate 输出中找到最佳滞后
【发布时间】:2020-01-05 00:27:48
【问题描述】:

我正在使用以下代码对 data_1 和 data_2 进行自相关:

result = numpy.correlate(data_1, data_2, mode='full')

结果也是时间序列。我还将结果标准化为 result1:

result1 = StandardScaler().fit_transform(result.astype('float32').reshape(-1, 1))

接下来是剧情,data_1 是黑色,data_2 是红色,result1 是绿色:

我知道data_1data_2 之间存在滞后,所以我想知道找到滞后的最佳方法是什么?谢谢!

【问题讨论】:

  • 这不是自动相关。自相关是在信号和同一信号的延迟副本之间。您有两个信号,data1 和 data2。

标签: python numpy correlation


【解决方案1】:

numpy.correlate 不将数据居中,所以在调用方法之前应该这样做:

corr = np.correlate(data_1 - np.mean(data_1), 
                    data_2 - np.mean(data_2),
                    mode='full')

这只会将corr 改变一个常数,但仍然是合理的做法:不相关的变化将显示为 0。

其次,您的图表在一个水平刻度上包含所有三件事似乎没有帮助;使用mode='full',相关数组的长度大约是原始数组长度的两倍。

选择corrcorr.argmax() 的最大值是合理的做法。只需了解索引在此处的工作方式即可。使用 mode='full' 时,corr 的第 0 个索引对应于 formula sum_n a[n+k] * conj(v[n])1 - len(a) 中的移位 k,这意味着 a 向左移动了极远,因此只有一个重叠元素在 av 之间移动。因此,从该索引中减去len(a) - 1 会得到a 相对于v 的实际偏移。

虚构的例子:

import numpy as np
import matplotlib.pyplot as plt
data_1 = np.sin(np.linspace(0, 10, 100))
data_1 += np.random.uniform(size=data_1.shape)   # noise
data_2 = np.cos(np.linspace(0, 7, 70))
data_2 += np.random.uniform(size=data_2.shape)   # noise
corr = np.correlate(data_1 - np.mean(data_1), 
                    data_2 - np.mean(data_2),
                    mode='full')
plt.plot(corr)
plt.show()
lag = corr.argmax() - (len(data_1) - 1)
print(lag)
plt.plot(data_1, 'r*')
plt.plot(data_2, 'b*')
plt.show()

这里的滞后被打印为 -14 或 -15(取决于随机噪声),在此比例上表示 -1.4 或 -1.5。这是合理的,因为 sin 比 cos 低 pi/2,即大约 1.57。换句话说,将红点向左移动 14-15 个元素可以最大化与蓝点的匹配。

数据:

相关性:

【讨论】:

  • 我正在使用这个函数,但是我不习惯返回一个不相关的函数。我正在创建要附加的相关性列表,我发现指定的滞后不高于滞后 0 处的相关性。但是为索引 0 输出的 corr 不是 argmax ......这就是为什么我希望这个函数输出相关性......现在我将不得不手动完成
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2014-02-26
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多