我正在尝试在 Python 中使用 Numpy 进行时间序列分析。
我有两个中等大小的系列,每个都有 20k 值,我想检查滑动相关性。
corrcoef 给了我一个自相关/相关系数矩阵作为输出。在我的情况下,它本身没有任何用处,因为其中一个系列包含滞后。
correlate 函数(在 mode="full"中)返回一个 40k 元素列表,该列表看起来确实像我想要的结果(峰值与列表中心一样远,因为滞后表明),但这些值都很奇怪 - 最多 500,而我期待的是从 -1 到 1 的值。
我不能把它全部除以最大值;我知道最大相关性不是 1。
如何标准化“互相关”(“完全”模式下的相关性),以便返回值将是每个滞后步骤的相关性,而不是那些非常大、奇怪的值?
最佳答案
您正在寻找归一化的互相关。该选项在 Numpy 中尚不可用,但 a patch正在等待审核,这正是您想要的。我认为应用它应该不会太难。大多数补丁只是文档字符串的东西。它添加的唯一代码行是
if normalize:
a = (a - mean(a)) / (std(a) * len(a))
v = (v - mean(v)) / std(v)
其中 a 和 v 是输入的 numpy 数组,您将在其中找到互相关。将它们添加到您自己的 Numpy 发行版中或者只是制作相关函数的副本并在那里添加行应该不难。如果我选择走这条路,我会亲自做后者。
另一个可能更好的替代方法是在将输入向量发送到相关之前对其进行归一化。由您自己决定。
顺便说一下,这似乎是根据 Wikipedia page on cross-correlation 的正确规范化。除了除以 len(a)
而不是 (len(a)-1)
。我觉得差异类似于 standard deviation of the sample vs. sample standard deviation在我看来真的不会有太大的不同。
关于python - 为什么 NUMPY correlate 和 corrcoef 返回不同的值以及如何在 "normalize"模式下关联 "full"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5639280/