gpt4 book ai didi

python - 从 numpy.correlate 输出中找到最佳滞后

转载 作者:太空狗 更新时间:2023-10-30 02:53:29 29 4
gpt4 key购买 nike

我正在使用以下代码对 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 之间存在延迟,所以我想知道找出延迟的最佳方法是什么?谢谢!

最佳答案

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

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

这只会将 corr 更改为常数,但仍然是合理的做法:不相关的偏移将显示为 0。

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

使用 corr.argmax() 选择 corr 的最大值是一个合理的做法。人们只需要知道索引在这里是如何工作的。在 mode='full' 的情况下,corr 的第 0 个索引对应于 formula sum_n a[n+k] * conj(v[n]) 中的移位 k1 - 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。这是合理的,因为 sin 是 cos 的尾随 pi/2,或大约 1.57。换句话说,将红点向左移动 14-15 个元素可以最大化与蓝点的匹配。

数据:

data

相关性:

correlation

关于python - 从 numpy.correlate 输出中找到最佳滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49372282/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com