在做机器学习预测时,往往需要对数据进行auto-correlation和partial auto-correlation function(ACF和PACF),根据查阅文献和相关资料,整理出比较容易上手和理解的知识与代码:
定义:
自相关系数:把一列数据按照滞后数拆成两列数据,在对这两列数据做类似相关系数的操作。
这组数据是求滞后数为2的自相关系数,则变成求{x1,x2,...,x8}和{x3,x4,...,x10}两者的“相关系数”,相关系数打引号是因为这个相关系数的公式和以往的有点不一样。下面看一下公式的对比:
要注意的是在计算自相关系数的时候 是使用的总体的均值, 可以看到他们除了
取得不一样, 几乎就是一样的。所以,我们可以这么理解自相关系数, 就是用来表达一组数据前后数据 (自己和自己) 的相关性
偏自相关系数:对于平稳AR(p)序列,所谓滞后k偏自相关系数就是指在给定中间k-1个随即变量Xt-1,Xt-2,...,Xt-k+1的条件下,或者说,在剔除了中间k-1个随即变量的干扰滞后,Xt-k对Xt影响的相关度量。用数学语言描述就是
概念和原理是比较好懂的,如何python实现呢,这里我们介绍一个比较好用的py库:statsmodels
代码:
安装所需要的py库
pip install statsmodels
导入所需要的包
import numpy as np
import statsmodels as st
import statsmodels.api as sm
from matplotlib import pyplot
from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.graphics.tsaplots import plot_acf
在这里,我使用了某站点2年的月尺度降水数据为例
pre=np.array([12,24,43,53,130,102,140,159,133,84,42,26,29,46,37,66,71,103,150,143,129,75,33,12])
ACF
#参数设置:pre输入数据,nlags需要计算的lag时长,alpha置信区间
ACF=sm.tsa.stattools.acf(pre, adjusted=False, nlags=15, qstat=False, fft=True, alpha=.05, missing='none')
print(ACF)
#输出结果:第一个是在1至15lag下的相关系数,第二个是95%置信区间的相关系数
'''(array([ 1. , 0.70040232, 0.30596026, -0.12741208, -0.46239925,
-0.56591442, -0.5848706 , -0.47952963, -0.26610439, 0.0271988 ,
0.25168961, 0.44747089, 0.45208154, 0.33528031, 0.15724224,
-0.07627136]), array([[ 1. , 1. ],
[ 0.30032635, 1.10047829],
[-0.2571567 , 0.86907722],
[-0.71653671, 0.46171255],
[-1.0559181 , 0.13111961],
[-1.21453666, 0.08270782],
[-1.30821883, 0.13847763],
[-1.27497781, 0.31591855],
[-1.1065503 , 0.57434153],
[-0.82662649, 0.8810241 ],
[-0.60227436, 1.10565358],
[-0.41828508, 1.31322687],
[-0.44993365, 1.35409674],
[-0.60230016, 1.27286077],
[-0.79933652, 1.113821 ],
[-1.03697838, 0.88443565]]))'''
作图
#参数设置:pre输入数据,lags所计算的lag范围
plot_acf(pre,lags=15,color='c')
pyplot.show()
PACF
#输入数据类似ACF,注意PACF的nlags需要少于数组长度的一半
PACF=st.tsa.stattools.pacf(pre,nlags=8,method='ywadjusted', alpha=0.05)
print(PACF)
#输出结果
'''(array([ 1. , 0.7308546 , -0.4301233 , -0.47442131, -0.3657477 ,
-0.0327055 , -0.58720785, -0.84116329, -2.90972345]), array([[ 1. , 1. ],
[ 0.33077862, 1.13093057],
[-0.83019927, -0.03004733],
[-0.87449728, -0.07434534],
[-0.76582367, 0.03432827],
[-0.43278147, 0.36737047],
[-0.98728382, -0.18713188],
[-1.24123927, -0.44108732],
[-3.30979943, -2.50964748]]))'''
作图
plot_pacf(pre, lags=8)
pyplot.show()
参考: