大家好,欢迎来到IT知识分享网。
文章来源
时间序列
常用的时间序列模型有AR模型(Autoregressive model:自回归模型)、MA模型(moving average model:滑动平均模型)、ARMA模型(Auto-Regressive and Moving Average Model:自回归滑动平均模型)和ARIMA模型(Autoregressive Integrated Moving Average Model:自回归积分滑动平均模型)等。
时间序列的预处理(使数据平稳化和随机化)
拿到一个观察值序列之后,首先要对它的平稳性和纯随机性进行检验,这两个重要的检验称为序列的预处理。根据检验的结果可以将序列分为不同的类型,对不同类型的序列我们会采用不同的分析方法。
平稳化处理
平稳 就是围绕着一个常数上下波动且波动范围有限,即有常数均值和常数方差。如果有明显的趋势或周期性,那它通常不是平稳序列。序列平稳不平稳,一般采用三种方法检验:
时序图检验

看看上面这个图,很明显的增长趋势,不平稳。
利用自相关系数和偏相关系数
单位根检验
利用差分将序列数据转换为平衡序列
随机化处理
对于纯随机序列,又称白噪声序列,序列的各项数值之间没有任何相关关系,序列在进行完全无序的随机波动,可以终止对该序列的分析。白噪声序列是没有信息可提取的平稳序列。对于平稳非白噪声序列,它的均值和方差是常数。通常是建立一个线性模型来拟合该序的发展,借此提取该序列的有用信息。ARMA模型是最常用的平稳序列拟合模型。
平稳时间序列建模
混合自回归移动平均过程(公式表达)
差分方程
所谓差分方程即将变量 y t y_t yt与它的滞后期联系起来的表达式。
研究变量在第t期的值记为 y t y_t yt。假定给出的动态方程将变量y第t期的值与另外的变量 w t w_t wt以及y的前一期联系起来:
y t = ϕ y t − 1 + w t y_t=ϕy_{t−1}+w_t yt=ϕyt−1+wt
上述称为一阶差分方程是因为仅仅只有变量的一阶滞后 ( y t − 1 ) (y_t−1) (yt−1)出现在方程中。
移动平均
“移动平均”的含义源于 Y t Y_t Yt是最近两期的 ϵ \epsilon ϵ的加权平均。
令 ϵ t {\epsilon_t} ϵt是一个白噪声序列。
Y t = μ + ϵ t + θ ϵ t − 1 Y_t=μ+\epsilon_t+θ\epsilon_{t−1} Yt=μ+ϵt+θϵt−1
其中μ和θ可以是任意的常数。这个时间序列称为一阶移动平均过程,记为 M A ( 1 ) MA(1) MA(1)。
自回归过程
一阶自回归过程
一个一阶自回归,记作 A R ( 1 ) AR(1) AR(1)满足下面的差分方程
Y t = c + ϕ Y t − 1 + ϵ t Y_t=c+ϕY_{t−1}+\epsilon_t Yt=c+ϕYt−1+ϵt
ϵ t {\epsilon_t} ϵt是一个白噪声序列。
p阶自回归过程
一个p阶自回归,记作 A R ( p ) AR(p) AR(p)满足下式
Y t = c + ϕ 1 Y t − 1 + ϕ 2 Y t − 2 + . . . + ϕ p Y t − p + ϵ t Y_t=c+ϕ_1Y_{t−1}+ϕ_2Y_{t−2}+…+ϕ_pY{t−p}+\epsilon_t Yt=c+ϕ1Yt−1+ϕ2Yt−2+…+ϕpYt−p+ϵt
混合自回归移动平均过程
一个 A R M A ( p , q ) ARMA(p,q) ARMA(p,q)过程包括自回归和移动平均项:
Y t = c + ϕ 1 Y t − 1 + ϕ 2 Y t − 2 + . . . + ϕ p Y t − p + ϵ t + θ 1 ϵ t − 1 + θ 2 ϵ t − 2 + . . . + θ q ϵ t − q Y_t=c+ϕ_1Y_{t−1}+ϕ_2Y_{t−2}+…+ϕ_pY{t−p}+\epsilon_t+θ_1ϵ_{t−1}+θ_2ϵ{t−2}+…+θ_qϵ_{t−q} Yt=c+ϕ1Yt−1+ϕ2Yt−2+…+ϕpYt−p+ϵt+θ1ϵt−1+θ2ϵt−2+…+θqϵt−q
利用statsmodels库实现时间序列的分析处理
python中有专门的库statsmodels可以用来作时间序列分析,但spark中则没有现成的。
#-*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import pandas as pd
data=pd.read_csv('./HIS_MONTH.csv')
b=data['fData']
plt.plot(data['fData'])
plt.show()
#自相关图
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data['fData']).show()
#偏自相关图
from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(data['fData']).show()
#平稳性检测
from statsmodels.tsa.stattools import adfuller as ADF
print('原始序列的ADF检验结果为:')
print(ADF(data['fData']))
#返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore
如下所示
原始序列的ADF检验结果为:
(-6.561077625309946, 8.378411469638636e-09, 0L, 47L, {'5%': -2.925338105429433, '1%': -3.5778480370438146, '10%': -2.6007735310095064}, 273.5266547319719)
p值远小于0.05,拒绝原假设(原假设认为存在单位根),所以该序列为平衡时间序列。
#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print('差分序列的白噪声检验结果为:')
print(acorr_ljungbox(data['fValueData'], lags=1))
结果如下
差分序列的白噪声检验结果为:
(array([0.05198092]), array([0.81965149]))
P=0.81965149,统计量的P值大于显著性水平0.05,则接受原假设(原假设认为为白噪声序列)。
下面对原序列做一阶差分运算
#差分后的结果
D_data = data['fValueData'].diff().dropna()
D_data.columns = ['fValueData']
#时序图
D_data.plot()
#自相关图
plot_acf(D_data).show()
plt.show()
#偏自相关图
plot_pacf(D_data).show()
#平稳性检测
print('差分序列的ADF检验结果为:')
print( ADF(D_data))
结果如下
差分序列的ADF检验结果为:
(-4.595500765524432, 0.0001316587309452837, 10L, 36L, {'5%': -2.9459512825788754, '1%': -3.626651907578875, '10%': -2.6116707716049383}, 270.35268975914374)
p值远小于0.05,拒绝原假设(原假设认为存在单位根),所以该序列为平衡时间序列。
#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
#返回统计量和p值
print('差分序列的白噪声检验结果为:')
print(acorr_ljungbox(D_data, lags=1))
结果如下:
差分序列的白噪声检验结果为:
(array([12.35619393]), array([0.00043953]))
P=0.00043953,统计量的P值小于显著性水平0.05,则拒绝原假设(原假设认为为白噪声序列),所以一阶差分后该序列为非白噪声序列,有进一步分析的价值。
Holt-Winters模型原理及python实现
本部分来源,也可以参考该文
原理分析
移动平均(The simple moving average (MA))
直观上,最简单的平滑时间序列的方法是实现一个无权重的移动平均,目前已知的方法是用窗口函数,平滑统计量 S t S_t St就是最近k个观察值的均值。公式如下:
s t = 1 k ∑ n = 0 k − 1 x t − n = x t + x t − 1 + … + x t − k + 1 k = s t − 1 + x t − x t − k k s_t=\frac{1}{k} \sum_{n=0}^{k-1} x_{t-n}=\frac{x_t+x_{t-1}+\ldots + x_{t-k+1}}{k}=s_{t-1}+\frac{x_t -x_{t-k}}{k} st=k1n=0∑k−1xt−n=kxt+xt−1+…+xt−k+1=st−1+kxt−xt−k
这样的方法存在明显的缺陷,当k比较小时,预测的数据平滑效果不明显,而且突出反映了数据最近的变化;当k较大时,虽然有较好的平滑效果,但是预测的数据存在延迟。而且最少需要k个值(窗口有限)。
加权移动平均
简单指数平滑法
简单指数平滑法适用于没有总体趋势的时间序列。如果用来处理有总体趋势的序列,平滑值将往往滞后于原始数据,除非α的值接近1,但这样一来就会造成不够平滑。
二次指数平滑(HoltWinters-无季节趋势)
为了解决上述问题,于是引出了二次指数平滑,能够保留总体趋势信息。因为将指数平滑应用了两次,所以被称为二次指数平滑。与简单指数平滑相比,二次指数平滑加入了时间趋势统计量 t i t_i ti,公式如下:
s i = α x i + ( 1 − α ) ( s i − 1 + t i − 1 ) t i = β ( s i − s i − 1 ) + ( 1 − β ) t i − 1 s_i=\alpha x_i + (1-\alpha)(s_{i-1}+t_{i-1})\\ t_i=\beta (s_i-s_{i-1}) + (1-\beta)t_{i-1} si=αxi+(1−α)(si−1+ti−1)ti=β(si−si−1)+(1−β)ti−1
s i s_i si添加了与一次指数平滑相比,添加了一个新的趋势项 t i t_i ti;而 t i t_i ti的表达式与一次指数平滑形式上是一样的,只不过用将 x i x_i xi换成 ( s i − s i − 1 ) (s_i-s_{i-1}) (si−si−1),趋势可以想像成增量,就是在此刻与上一刻的差值,趋势当然应该用平滑后的数据的差值;同时将一次平滑中的 s i − 1 s_{i-1} si−1换成 t i − 1 t_{i-1} ti−1
二次指数平滑的预测公式为
x i + h = s i + h t i x_{i+h}=s_i+h \ t_i xi+h=si+h ti
二次指数平滑的预测结果是一条斜的直线
三次指数平滑
累加性公式如下:
s i = α ( x i − p i − k ) + ( 1 − α ) ( s i − 1 + t i − 1 ) t i = β ( s i − s i − 1 ) + ( 1 − β ) t i − 1 p i = γ ( x i − s i ) + ( 1 − γ ) p i − k x i + h = s i + h b i + p i − k + h m o d k s_i=\alpha (x_i-p_{i-k} )+(1-\alpha)(s_{i-1}+t_{i-1})\\ t_i=\beta (s_i-s_{i-1}) + (1-\beta)t_{i-1}\\ p_i=\gamma (x_i-s_i) + (1-\gamma)p_{i-k}\\ x_{i+h}=s_i+hb_i + p_{i-k+h \ mod \ k} si=α(xi−pi−k)+(1−α)(si−1+ti−1)ti=β(si−si−1)+(1−β)ti−1pi=γ(xi−si)+(1−γ)pi−kxi+h=si+hbi+pi−k+h mod k
或者
x i + h = s i + h b i + p i − k + 1 + ( h − 1 ) m o d k x_{i+h}=s_i+hb_i + p_{i-k+1+(h-1) \ mod \ k} xi+h=si+hbi+pi−k+1+(h−1) mod k
两个公式还需要确认下
累加性公式初始值的计算
s k = 1 k ( s 1 + s 2 + ⋯ + s k ) t k = 1 k [ x k + 1 − x 1 k + x k + 2 − x 2 k + ⋯ + x k + k − x k k ] p 1 = x 1 − s k , p 2 = x 2 − s k , ⋯ , p k = x k − s k s_k=\frac{1}{k} (s_1+s_2+\cdots+s_k)\\ t_k=\frac{1}{k}\left[ \frac{x_{k+1}-x_1}{k}+\frac{x_{k+2}-x_2}{k}+\cdots+\frac{x_{k+k}-x_k}{k} \right]\\ p_1=x_1-s_k,p_2=x_2-s_k,\cdots,p_k=x_k-s_k sk=k1(s1+s2+⋯+sk)tk=k1[kxk+1−x1+kxk+2−x2+⋯+kxk+k−xk]p1=x1−sk,p2=x2−sk,⋯,pk=xk−sk
其中 α \alpha α是数据平滑因子, 0 < α < 1 0 < \alpha < 1 0<α<1; β \beta β是趋势平滑因子, 0 < β < 1 0 < \beta < 1 0<β<1; γ \gamma γ是季节改变平滑因子 0 < γ < 1 0 < \gamma < 1 0<γ<1。
α , β , γ \alpha,\beta,\gamma α,β,γ的值都位于[0,1]之间,可以多试验几次以达到最佳效果。
s , t , p s,t,p s,t,p初始值的选取对于算法整体的影响不是特别大,通常的取值为 s 0 = x 0 , t 0 = x 1 − x 0 s_0=x_0,t_0=x_1-x_0 s0=x0,t0=x1−x0,累加时 p = 0 p=0 p=0,累乘时 p = 1 p=1 p=1.
对三次指数平滑法而言,我们必须初始化一个完整的“季节” p i p_i pi的值,不过我们可以简单地设置为全1(针对累乘式)或全0(针对累加式)。只有当序列的⻓度较短时,我们才需要慎重考虑初始值的选取。
我们这里讲的Holt-Winters模型就是三次指数平滑法。哇,终于切入正题了。
所有的指数平滑法都要更新上一时间步⻓的计算结果,并使用当前时间步⻓的数据中包含的新信息。它们通过“混合”新信息和旧信息来实现,而相关的新旧信息的权重由一个可调整的拌和参数来控制。各种方法的不同之处在于它们跟踪的量的个数和对应的拌和参数的个数。三次指数平滑法,功能最强大,既能体现趋势性又能体现季节性,所以三次指数平滑法的参数最多,有三个。
下图为使用累加三次指数平滑进行预测的效果:其中红色为源时间序列,蓝色为预测的时间序列, α , β , γ \alpha,\beta,\gamma α,β,γ的取值为0.45,0.2,0.95:
下图为累乘三次指数平滑进行预测的效果, α , β , γ \alpha,\beta,\gamma α,β,γ的取值为0.4,0.05,0.9:
可以看到三次指数平滑算法可以很好的保存时间序列数据的趋势和季节性信息,在International Airline Passengers数据集上累乘平滑指数算法的效果更好。
python代码实现
RMSE的实现
statsmodels中的holtwinters
基于SVM作短期时间序列的预测
具体应用的例子:
LSTM模型分析及对时序数据预测的具体实现(python实现)
来源:2017年09月30日 10:28:08
如何用LSTM自编码器进行极端事件预测?(含Python代码)
时间序列的并行实现
基于小波变换的时间序列预测,Python实现,来自雪球
清华AIOps算法:KPI聚类
其他资料
NeuralProphet:基于神经网络的时间序列建模库
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/113316.html

