在分析时间序列时,通常需要计算一个序列的自相关系数。自相关(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 | def autocorrelation(x,lags):#计算lags阶以内的自相关系数,返回lags个值,分别计算序列均值,标准差 |
通常在实际中,很多时间序列的均值和标准受时间变化的影响较小,可以看作是恒定的,此时:
\[R(k) = \frac{E(X_{k+1,n}-\mu)(X_{1,n-k}-\mu)}{\sigma^2}\]
同样可以利用correlate函数实现:
1 | def autocorrelation(x,lags):#计算lags阶以内的自相关系数,返回lags个值,将序列均值、标准差视为不变 |
- http://stackoverflow.com/questions/643699/how-can-i-use-numpy-correlate-to-do-autocorrelation