为什么NUMPY相关并且corrcoef返回不同的值以及如何在“完整”模式中“标准化”相关性?

时间:2011-04-12 17:33:18

标签: python numpy normalization time-series correlation

我正在尝试使用Numpy在Python中使用一些时间序列分析。

我有两个中等大小的系列,每个系列有20k值,我想检查滑动相关性。

corrcoef给我输出一个自相关/相关系数矩阵。在我的案例中没有任何有用的东西,因为其中一个系列包含滞后。

correlate函数(在mode =“full”中)返回一个40k元素列表,看起来像我想要的那种结果(峰值离列表中心很远,因为Lag会指示),但值很奇怪 - 高达500,当我期待从-1到1的东西时。

我不能把它全部除以最大值;我知道最大相关性不是1。

我如何规范化“互相关”(“完全”模式下的相关性),因此返回值将是每个滞后步骤的相关性,而不是那些非常大的奇怪值?

2 个答案:

答案 0 :(得分:26)

您正在寻找规范化的互相关。 Numpy中尚未提供此选项,但a patch正在等待您想要的审核。我认为应用它应该不会太难。大多数补丁只是doc string的东西。它添加的唯一代码行是

if normalize:
    a = (a - mean(a)) / (std(a) * len(a))
    v = (v - mean(v)) /  std(v)

其中a和v是输入的numpy数组,您可以在其中找到互相关。将它们添加到您自己的Numpy发行版中或者只是复制相关函数并在那里添加行应该不难。如果我选择走这条路,我会亲自做后者。

另一种可能更好的替代方法是在将输入向量发送到关联之前对输入向量进行标准化。这取决于你想要这样做的方式。

顺便说一句,除了len(a)而不是(len(a)-1)之外,这似乎是Wikipedia page on cross-correlation的正确规范化。我觉得这种差异类似于standard deviation of the sample vs. sample standard deviation,在我看来真的不会产生太大的影响。

答案 1 :(得分:0)

根据这个slides,我建议这样做:

shouldComponentUpdate()