時間序列預測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 模型
    Yt=w1Yt1+w2Yt2+w3Yt3+...+wiYtk+e Y_t = w_1*Y_{t-1}+w_2*Y_{t-2}+w_3*Y_{t-3}+...+w_i*Y_{t-k}+e
    自變量不是影響因變量的外界因素,而是因變量本身

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

  • 假定預測對象有一種水平樣式,含有隨機波動成分,可以採用簡單指數平滑法進行短期預測

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

Ft+1 下期預測值 Ft 本期預測值   Yt 本期實際值 et 本期誤差值\text{$F_{t+1}$ 下期預測值 \, $F_t$ 本期預測值 \; $Y_t$ 本期實際值 $e_t$ 本期誤差值}

\text{}

下期預測值 是本期預測值與以a爲折扣的本期實際值與預測值誤差之和
Ft=Ft1+a(Yt1Ft1)F_t = F_{t-1} + a(Y_{t-1}-F_{t-1})

所以Ft+1=Ft1+a(Yt1Ft1)+a(YtFt)=Ft1+a(et1)+a(et)=Ft2+a(et2)+a(et1)+a(et)\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})

Ft2, 一個初始預測值 Ft-2,新的預測值等於這個初始值加上之前各期誤差的一部分

  • MA模型

Yt=b0+b1et1+b2et2+b3et3+...++bketk+ekY_t = b_0+b_1e_{t-1}+b_2e_{t-2}+b_3e_{t-3}+...++b_ke_{t-k}+e_k


6.自迴歸移動平均結合模型(ARMA )

  • 只適合平穩時間序列的預測,實際問題中有各種趨勢性和季節性
     p階自迴歸 q階移動平均混合模型Ytϕ1Yt1ϕ2Yt2...ϕpYtp=θ1et1θ2et2θ3et3...θqetq+et \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

 ϕ 自迴歸係數 θ 移動平均係數 \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(","))

image

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()

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章