python numpy 计算自相关系数

在分析时间序列时,通常需要计算一个序列的自相关系数。自相关(Autocorrelation)又叫做序列相关,通常采用自相关系数来发现序列的重复规律,周期等信息。

我们有序列$X:x_1,x_2,x_3,…,x_n$,设$X_{s,t}$为$s$时刻开始,$t$时刻结束的序列:$x_s,x_{s+1}…,x_{t-1},x_t$。$\mu_{s,t}$为序列$X_{s,t}$的均值,$\sigma_{s,t}$为序列$X_{s,t}$的标准差。那么一阶自相关系数为:

$$R(1) = \frac{E(X_{2,n}-\mu_{2,n})(X_{1,n-1}-\mu_{1,n-1})}{\sigma_{2,n}\sigma_{1,n-1}}$$

同理$k$阶自相关系数为:

$$R(k) = \frac{E(X_{k+1,n}-\mu_{k+1,n})(X_{1,n-k}-\mu_{1,n-k})}{\sigma_{k+1,n}\sigma_{1,n-k}}$$

python的numpy库里没有直接计算序列自相关系数的函数,但有计算两个不同序列的相关系数函数: correlate。给定两个序列$X,Y$,correlation(X,Y) = $\sum XY$。可以利用correlate函数计算$X$的自相关性:

def autocorrelation(x,lags):#计算lags阶以内的自相关系数,返回lags个值,分别计算序列均值,标准差
	n = len(x)
	x = numpy.array(x)
	result = [numpy.correlate(x[i:]-x[i:].mean(),x[:n-i]-x[:n-i].mean())[0]\
		/(x[i:].std()*x[:n-i].std()*(n-i)) \
		for i in range(1,lags+1)]
	return result

通常在实际中,很多时间序列的均值和标准受时间变化的影响较小,可以看作是恒定的,此时:

$$R(k) = \frac{E(X_{k+1,n}-\mu)(X_{1,n-k}-\mu)}{\sigma^2}$$

同样可以利用correlate函数实现:

def autocorrelation(x,lags):#计算lags阶以内的自相关系数,返回lags个值,将序列均值、标准差视为不变
	n = len(x)
	x = numpy.array(x)
	variance = x.var()
	x = x-x.mean()
	result = numpy.correlate(x, x, mode = 'full')[-n+1:-n+lags+1]/\
		(variance*(numpy.arange(n-1,n-1-lags,-1)))
	return result

参考:http://stackoverflow.com/questions/643699/how-can-i-use-numpy-correlate-to-do-autocorrelation