python 相关系数矩阵,python 相关性系数
最近学习时间序列预测销量,做一些笔记。
参考:
自相关系数
根据自相关图判断AR/MA/ARMA模型
平稳时间序列在后续分析之前,时间序列必须是平稳的。差值和对数都用来使时间序列稳定。
如果一个时间序列的均值和方差没有系统性或周期性的变化(均值无变化:趋势不明显,方差无变化:相对稳定的波动),则称该时间序列是稳定的。
自相关系数平稳序列的自相关系数将快速收敛。从其快速收敛(从较大值突然下降到0附近)的阶次表明是哪个阶模型,如自相关函数图的尾部,部分自相关函数图的尾部,n从2或3控制在置信区间内,因此可以判断为AR(2)模型或AR(3)模型。
从相关系数原理来看,“n从2或3开始”的意思是:自相关系数的阶数为2阶或3阶时迅速降为0附近,即在剔除了中间的2或3个变量后,序列开始稳定。
下面是自相关系数的原理(点击打开链接):
自相关系数是常数,它是一个参数,不会衰减到零。Xt=rho*xt-1 eslion,其中rho为自相关系数。自回归方程的本质是一个差分方程。通过求解这个方程的根,可以得到xt随t变化的解,如果根的模大于1,xt会爆炸或趋于无穷大,不会收敛。自相关系数在1左右时,是单位根,也是非收敛的。
让我们手动计算一个自相关系数来理解:
并且编了一个小函数来加深我们的理解。
Get _ auto _ corr (timeSeries,k): descr: input: timeSeries,lag order k output: k阶时间序列的自相关系数l:时间序列的长度timeseries timeSeries1,timeSeries2:拆分序列1,拆分序列2 timeSeries_mean:序列的平均值timeSeries_var:平均值减去序列中各项的平方和timeSeries l=len(timeSeries) #取出两个要计算的数组time series 1=time series[0:l-k]time series 2对于范围(l-k)中的I,sum()auto _ corr=0:temp=(time series 1[I]-time series _ mean)*(time series 2[I]-time series _ mean)/time series _ var auto _ corr=auto _ corr temp return auto _ corr
参见计算的最后一部分。举个反例,有序列A{1,10,100,1000,10000}和序列B{100,1,1000,10,10000}
数列A和B的方差和均值都相等,所以自相关系数的值取决于被拆分的两个数列。但序列A有明显的上升趋势。按照之前的理解,序列A不稳定的概率大于序列b。
嗯,结果好像有点出乎意料。
我们再编一个函数来画它们的自相关系数图,结果好像没什么区别。
DEF plot _ auto _ corr (timeSeries,k): descr:需要计算自相关函数get_auto_corr(timeSeries,k)。输入你想画的时间序列和顺序k。k不能超过时间序列的长度。输出:K阶自相关系数图,用于判断I在range (1,k 1)中的平稳性 time series time series=PD . data frame(range(K)):time series time series . loc[I-1]=get _ auto _ corr(time series,i) plt.bar(range(1,len(timeSeriestimeSeries) 1),timeSeriestimeSeries[0])
分割序列A和B:
a1:{ 1101001000 }
A2:{10,100,1000,10000}
B1: {100,1,1000,10}
B2:{ 11000,1010000 }
自相关系数图不符合假设反例的原因是没有加上分子的绝对值,有些项减去平均值后为正,有些项减去平均值后为负,抵消了。
所以为什么自相关系数迅速收敛可以判断序列平稳呢,序列平稳是没有趋势性的,而上面反例中A比B的趋势性要明显。
自相关系数应该描述的不是趋势性,而是序列1和序列2的相关性,显然如果序列1和序列2完全相同,自相关系数为0,以序列C为例{1,1,1,1,1},显然不管多少阶的自相关系数都为0
序列D{1,1,1,1,2},自相关系数的值会比较小,而且如果有序列E{2,1,1,1,1},我们可以发现D和E的自相关系数图是一样的!如果有F{1,1,2,1,1},把2放在中间才会有改变,那么再有G{2,2,3,2,2},会发现F和G的自相关系数图又会保持一致,A{2,2,2,2,3}会和序列D、E的自相关系数图一致。
从上面可以看出,自相关系数在{1,1,1,1,1}时至少为0,在序列{1,2,3,4,5}时会更大。那么自相关系数有特定的含义吗?
在第二个例子中,这三个序列的自相关系数是近似的,但不完全相等。例如,A的一阶相关系数约为0.299999999,B的一阶相关系数为3.0000.0004。
A=np.array([1,1,2,1,1])
B=np.array([100,100,200,100,100])
C=np.array([100,100,101,100,100])
plot_auto_corr(A,4)
Out[10]:
0
0 -0.30
1 -0.35
2 0.10
3 0.05
plot_auto_corr(B,4)
Out[11]:
0
0 -0.30
1 -0.35
2 0.10
3 0.05
plot_auto_corr(C,4)
Out[12]:
0
0 -0.30
1 -0.35
2 0.10
3 0.05
目前得出来的结论就是自相关系数可以用来衡量序列的值的差异性,但是为什么随着自相关系数的阶数增加,自相关系数迅速下降到0附近的序列就是稳定时间序列的证明。需要查阅专业书籍。
(补充"https://uqer.io/community/share/5790a091228e5b90cda2e2ea",这个链接里面说得很清楚了,解决了许多自相关系数的疑问)先到这里,去看拱门包吧。
根据自相关系数图判断使用模型https://www.cnblogs.com/foley/p/5582358.html
完整程序:
导入numpy作为NP导入pandas作为PD导入matplotlib。py绘制为PLT时间序列=NP。array([2,3,4,3,7])k=1时间序列1=np.array([1,10,100,1000,10000])时间序列2=NP。array([100,1,1000,10,10000])def get _ auto _ corr(时间序列,k): Descr:输入:时间序列时间序列,滞后阶数k输出:时间序列时间序列的k阶自相关系数l:序列时间序列的长度时间序列1,时间序列2:拆分序列1,拆分序列2时间序列平均值:序列时间序列的均值timeSeries_var:序列时间序列的每一项减去均值的平方的和 l=len(timeSeries) #取出要计算的两个数组时间序列1=时间序列[0:l-k]时间序列2=时间序列[k:]时间序列_均值=时间序列。mean()时间序列_ var=NP。array([I * * 2 for I in time series-time series _ mean]).对于范围(左至右)中的I,sum()auto _ corr=0:temp=(时序1[I]-时序_ mean)*(时序2[I]-时序_ mean)/时序_ var auto _ corr=auto _ corr temp return auto _ corr #画出各阶自相关系数的图k=4d ef plot _ auto _ corr(时间序列,k): 描述:需要计算自相关函数获取_自动_更正(时间序列,k)输入时间序列时间序列和想绘制的阶数k,k不能超过时间序列的长度输出:k阶自相关系数图,用于判断平稳性 timeSeriestimeSeries=pd .范围(1,k-1)中I的数据帧(范围(k)):timeSeriestimeSeries。loc[I-1]=get _ auto _ corr(time series,i) plt.bar(range(1,len(timeSeriestimeSeries) 1),timeSeriestimeSeries[0])返回时代周刊
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。