我使用以下代码对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_1
和data_2
之间存在滞后,所以我想知道找到滞后的最佳方法是什么?谢谢!
答案 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
移位a
和v
之间重叠的一个元素。因此,从此索引中减去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个元素可以最大化与蓝点的匹配。
数据:
相关性: