0%

自相关性

在分析时间序列时,通常需要计算一个序列的自相关系数。自相关(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\)的自相关性:

1
2
3
4
5
6
7
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函数实现:

1
2
3
4
5
6
7
8
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