从numpy.correlate输出中找出最佳延迟

时间:2018-03-19 20:59:49

标签: python numpy correlation

我使用以下代码对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为绿色:

enter image description here

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

1 个答案:

答案 0 :(得分:1)

canvas.dial_1_photo_new = ImageTk.PhotoImage(img2) dial_2 = canvas.create_image((dial_1_center), image=canvas.dial_1_photo_new, anchor=tk.E) 不会使数据居中,因此应该在调用方法之前执行此操作:

numpy.correlate

这只会使corr = np.correlate(data_1 - np.mean(data_1), data_2 - np.mean(data_2), mode='full') 改变一个常数,但仍然是一个合理的事情:不相关的转变将显示为0.

其次,在一个横向尺度上包含所有三件事的图表似乎没有用; corr与相关数组的长度大约是原始长度的两倍。

使用mode='full'挑选corr的最大值是合理的。人们只需要知道索引在这里是如何工作的。使用mode =' full' corr.argmax()的第0个索引对应formula sum_n a[n+k] * conj(v[n]) corr中的k转换,意味着1 - len(a)向左移动极远,因此只有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。这是合理的,因为罪的结果是pi / 2,即大约1.57。换句话说,将红点向左移动14-15个元素可以最大化与蓝点的匹配。

数据:

data

相关性:

correlation