我一直试图用numpy计算一个自相关函数,如statistical mechanics中定义的那样。我发现的大多数文档都与correlate和{a3}等函数相关。然而,对于给定的随机变量x,这些函数似乎只是计算和
ACF(dt) = sum_{t=0}^T [(x(t)*x(t+dt)]
而不是平均水平
^{pr2}$因此,实际上,要计算自相关函数,需要执行以下操作:
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才能正确。在
有人能确认这是正确的吗?在
一般来说,自相关、相关等是和(积分)。有时它是标准化的,但不是像你上面写的那样平均化。这是因为它们是用mathematical convolution operation来定义的,它只是你在上面写的一个和的积分。在
stat-mech页面的括号表示一个热平均值,即在某个温度下,在许多不同状态下多次发生的“实验”的集合或时间平均值。这(有限温度)会导致波动,导致问题的“统计”性质,并导致相关性衰减(长程顺序丢失)。这仅仅意味着您应该找到几个数据集的自相关,并将这些数据集的平均到一起,但不要取函数的平均值。在
据我所知,您的代码试图用重叠长度的长度来衡量
dt
处的相关性,但我不认为这是正确的。在关于
<s>
2的减法,这是在自旋模型的情况下,其中<s>
是平均自旋(磁化),所以我相信你应该使用mean(x)**2
是正确的。在作为旁注,我建议使用
mode='same'
而不是'full'
,这样关联域就与输入的域相匹配,而不必只查看输出的一半(这里的输出是对称的,所以它实际上没有什么区别)。在相关问题 更多 >
编程相关推荐