我正在使用以下代码对数据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
是绿色:我知道在
data_1
和data_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个元素向左移动红色点可以最大化与蓝色点的匹配。
数据:
相关性: