具有numpy的时间序列数据的自相关函数

时间:2013-04-15 14:28:03

标签: python numpy time-series correlation

我一直在尝试使用numpy来计算statistical mechanics中定义的自相关函数。我发现的大多数文档都与correlateconvolve等函数有关。但是,对于给定的随机变量x,这些函数似乎只计算总和

ACF(dt) = sum_{t=0}^T [(x(t)*x(t+dt)]

而不是平均值

ACF(dt) = mean[x(t)*x(t+dt)]

所以实际上为了计算自相关函数,需要做类似的事情:

acf = np.correlate(x,x,mode='full')
acf_half = acf[acf.size / 2:]
ldata = len(acf)
acf = np.array([x/(ldata-i) for i,x in enumerate(acf_half)])

当然我们需要从得到的acf中减去mean(x)** 2才是正确的。

有人可以确认这是正确的吗?

1 个答案:

答案 0 :(得分:0)

一般来说,自相关,相关等是和(积分)。有时它是标准化的,但在你上面写的意义上并不是平均的。这是因为它们是根据mathematical convolution operation来定义的,这只是你在上面写的总和。

stat mech页面上的括号表示热平均值,它是在某个温度下在许多不同状态下多次发生的“实验”的整体或时间平均值。这(有限温度)引起产生问题的“统计”性质的波动,并导致相关性的衰减(长程有序的损失)。这只是意味着您应该找到几个数据集的自相关,并将那些平均在一起,但不要采用函数的平均值。

据我所知,您的代码正在尝试权衡dt处的重叠长度dt ,但我不相信这是对的。

关于<s> 2 的减法,在自旋模型的情况下,其中<s>将是平均自旋(磁化),所以我相信你是对的,你应该使用mean(x)**2

作为旁注,我建议使用mode='same'代替'full',以便相关域与您输入的域匹配,而不必仅查看输出的一半(这里的输出是对称的,所以它并没有什么区别)。