我正在使用以下代码对数据1和数据2进行自动关联:

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

结果也是时间序列。我也将结果归一化:
result1 = StandardScaler().fit_transform(result.astype('float32').reshape(-1, 1))

这里是情节,data_1是黑色,data_2是红色,result1是绿色:
python - 从numpy.correlate输出中找到最佳滞后-LMLPHP
我知道在data_1data_2之间有一个延迟,所以我想知道找到延迟的最佳方法是什么?谢谢!

最佳答案

numpy.correlate不将数据居中,因此应在调用方法之前执行此操作:

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

这只改变了一个常数,但仍然是一个合理的做法:不相关的移位将显示为0。
第二,你的图表在一个水平的尺度上有三个东西似乎没有帮助;在corr中,相关数组的长度是原始数组长度的两倍。
mode='full'corr的最大值是合理的。我们只需要知道索引在这里是如何工作的。当模式为“full”时,corr.argmax()的第0个指数对应于formula corr中的移位k,这意味着sum_n a[n+k] * conj(v[n])被向左移动了很远,因此移位1 - len(a)a之间只有一个重叠元素。因此,从该索引中减去a给出了v相对于len(a) - 1的实际移位。
一个虚构的例子:
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。这是合理的,因为罪落后于由π/ 2,或约1.57的COS。换句话说,用14-15个元素向左移动红色点可以最大化与蓝色点的匹配。
数据:
python - 从numpy.correlate输出中找到最佳滞后-LMLPHP
相关性:
python - 从numpy.correlate输出中找到最佳滞后-LMLPHP

07-26 01:49