时间序列预测ARIMR(Spark scala,Python)

  1. 概要
  2. 平稳性
  3. 回归模型
  4. 自回归模型
  5. 滑动平均模型
  6. 自回归移动平均结合模型
  7. 差分法
  8. 差分移动平均自回归模型
  9. ARIMA计算步骤

1.概要

ARIMA模型由Box与Jenkins于上世纪七十年代提出,是一种著名的时间序列预测方法。ARIMA的含义是单积自回归移动平均过程,其含义为:假设一个随机过程含有d个单位根,其经过d次差分后可以变换为一个平稳的自回归移动平均过程,则该随机过程称为单积(整)自回归移动平均过程。

  • 名称解读

      AR: 自回归模型   Autoregressive model
      I : 差分        
      MA: 滑动平均模型 Moving average model
    
  • 本质

    线性回归,只不过是通过自身的历史数据进行回归,适用于数据本身存在着较高并且稳定的相关性,特点是简单、短期预测效果不错。


2.平稳性

  • 平稳性就是要求经由样本时间序列所得到的拟合曲线,在未来的一段时间内仍能顺着现有状态“惯性”地延续下去;

  • 平稳性要求序列的均值和方差不发生明显变化;
    平稳性要求序列的均值和方差不发生明显变化;

s^2 = \frac{\sum_{i=1}^{N}(x_n-m)^2}{N}

s^2 总体方差 x变量 m 总体均值


3.回归模型

  • 得一个线性模型以尽可能准确地预测实值输出标记
y = w_1*x_1+w_2*x_2+w_3*x_3+...+w_i*x_i+e

y: 因变量 x:自变量

w和b根据样本学得(最小二乘法或者最大似然估计或者神经网络)之后,模型就得以确定。w直观表达了各属性在预测中的重要性


4.自回归模型(AR Autoregressive model)

  • 和线性回归的区别

线性回归是由一个或者多个自变量推导预测因变量

自回归是由因变量之前的取值来推导预测本身,所以是自回归(受自身变化的影响)

  • AR 模型
    Y t = w 1 ∗ Y t − 1 + w 2 ∗ Y t − 2 + w 3 ∗ Y t − 3 + . . . + w i ∗ Y t − k + e Y_t = w_1*Y_{t-1}+w_2*Y_{t-2}+w_3*Y_{t-3}+...+w_i*Y_{t-k}+e Yt=w1Yt1+w2Yt2+w3Yt3+...+wiYtk+e
    自变量不是影响因变量的外界因素,而是因变量本身

5.滑动平均模型 (MA moving average model)

  • 假定预测对象有一种水平样式,含有随机波动成分,可以采用简单指数平滑法进行短期预测

F t + 1 = F t + a ( Y t − F t ) = F t + a ( e t ) F_{t+1} = F_{t} + a(Y_t-F_t)=F_{t}+a(e_t) Ft+1=Ft+a(YtFt)=Ft+a(et)

F t + 1  下期预测值    F t  本期预测值     Y t  本期实际值  e t  本期误差值 \text{$F_{t+1}$ 下期预测值 \, $F_t$ 本期预测值 \; $Y_t$ 本期实际值 $e_t$ 本期误差值} Ft+1 下期预测值 Ft 本期预测值 Yt 本期实际值 et 本期误差值

\text{}

下期预测值 是本期预测值与以a为折扣的本期实际值与预测值误差之和
F t = F t − 1 + a ( Y t − 1 − F t − 1 ) F_t = F_{t-1} + a(Y_{t-1}-F_{t-1}) Ft=Ft1+a(Yt1Ft1)

所以 F t + 1 = F t − 1 + a ( Y t − 1 − F t − 1 ) + a ( Y t − F t ) = F t − 1 + a ( e t − 1 ) + a ( e t ) = F t − 2 + a ( e t − 2 ) + a ( e t − 1 ) + a ( e t ) \text{所以} F_{t+1} = F_{t-1} + a(Y_{t-1}-F_{t-1}) + a(Y_t-F_t) =F_{t-1}+a(e_{t-1})+a(e_{t})=F_{t-2}+a(e_{t-2})+a(e_{t-1})+a(e_{t}) 所以Ft+1=Ft1+a(Yt1Ft1)+a(YtFt)=Ft1+a(et1)+a(et)=Ft2+a(et2)+a(et1)+a(et)

一 个 初 始 预 测 值 F t − 2 , 新 的 预 测 值 等 于 这 个 初 始 值 加 上 之 前 各 期 误 差 的 一 部 分 一个初始预测值 Ft-2,新的预测值等于这个初始值加上之前各期误差的一部分 Ft2,

  • MA模型

Y t = b 0 + b 1 e t − 1 + b 2 e t − 2 + b 3 e t − 3 + . . . + + b k e t − k + e k Y_t = b_0+b_1e_{t-1}+b_2e_{t-2}+b_3e_{t-3}+...++b_ke_{t-k}+e_k Yt=b0+b1et1+b2et2+b3et3+...++bketk+ek


6.自回归移动平均结合模型(ARMA )

  • 只适合平稳时间序列的预测,实际问题中有各种趋势性和季节性
     p阶自回归 q阶移动平均混合模型 Y t − ϕ 1 Y t − 1 − ϕ 2 Y t − 2 . . . − ϕ p Y t − p = − θ 1 e t − 1 − θ 2 e t − 2 − θ 3 e t − 3 − . . . − θ q e t − q + e t \text{ p阶自回归 q阶移动平均混合模型} \quad Y_t-\phi_1 Y_{t-1}-\phi_2 Y_{t-2} ...- \phi_p Y_{t-p}= -\theta_1e_{t-1}-\theta_2e_{t-2}-\theta_3e_{t-3}-...-\theta_qe_{t-q}+e_t  p阶自回归 q阶移动平均混合模型Ytϕ1Yt1ϕ2Yt2...ϕpYtp=θ1et1θ2et2θ3et3...θqetq+et

  ϕ  自回归系数  θ  移动平均系数 \text{ $\phi$ 自回归系数 $\theta$ 移动平均系数}  ϕ 自回归系数 θ 移动平均系数

可以看到 p=0 是移动平均模型 q=0 是自回归模型


7.差分法:时间序列在t与t-1时刻的差值 平稳数据

差分又名差分函数或差分运算,差分的结果反映了离散量之间的一种变化

差分操作实例

原数据 一阶 一阶差分 二阶 二阶差分
1
3 1 2
5 3 2 1 4
7 5 2 3 4

8. ARIMA(p,d,q) 差分移动平均自回归模型

  • 可以描述任何齐次非平稳时间序列
  • 差分到序列平稳以后使用ARMA模型预测

对于非平稳时间序列中若存在增长或下降趋势,则需要进行差分处理然后进行平稳性检验直至平稳为止。

自回归滑动平均差分模型

  • AR 自回归

  • MA 滑动平均

  • I 差分法

  • AIC 准则 赤池消息准则,衡量统计模型拟合好坏的标准,值越小越拟合

  • 最小信息量准则(An Information Criterion) 指导思想:
    似然函数值越大越好
    未知参数的个数越少越好

  • ARMA模型要求数据平稳,当数据不平稳时,需要差分。如果d阶差分后,序列平稳,叫做d阶单整序列
    如果差分很多次,还是不平稳。或者差分后已经失去研究意义了,那么就放弃ARIMA模型。


  • 相关博客
    https://www.guofei.site/2017/07/10/arima.html

scala
 val lines = scala.io.Source.fromFile("D://work//算法//时间序列预测//arima//spark-ts-examples-master//data//R_ARIMA_DataSet1.csv").getLines()
    val ts = Vectors.dense(lines.map(_.toDouble).toArray)
    /**
      * ARIMA
      */
    val arimaModel = ARIMA.fitModel(1, 0, 1, ts)
    val arimaModel1 = ARIMA.autoFit(ts)
    println("coefficients: " + arimaModel.coefficients.mkString(","))

    val forecast = arimaModel.forecast(ts, 10)
    val forecast1 = arimaModel1.forecast(ts,10)
    println("forecast of next 20 observations: " + forecast.toArray.mkString(","))
    println("forecast of next 20 observations: " + forecast1.toArray.mkString(","))

时间序列预测ARIMR(Spark scala,Python)_第1张图片

python

http://localhost:8889/notebooks/DataStructure/%E7%AE%97%E6%B3%95/timeseries/ARMA%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E5%9B%9E%E5%BD%92.ipynb

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARMA
from statsmodels.graphics.api import qqplot

import random

data = [ 5000+i*20+random.randint(200,700) if i%2==0 else 4500+i*20+random.randint(200,700) for i in range(99)]

data = pd.Series(data)
data_index = sm.tsa.datetools.dates_from_range('1901','1999')

# 绘制数据图
data.index = pd.Index(data_index)
data.plot(figsize=(12,8))
plt.show()

# 创建模型 ARMA
arma = ARMA(data,(16,0)).fit()
print('AIC: %0.4lf'%arma.aic)

# 模型预测
predict_y = arma.predict('1941','2048')
# 预测结果绘制
fig,ax = plt.subplots(figsize=(12,8))
ax = data.ix['1901':].plot(ax=ax)
predict_y.plot(ax=ax)
plt.show()

时间序列预测ARIMR(Spark scala,Python)_第2张图片

你可能感兴趣的:(大数据,数据结构与算法,Python)