zoukankan      html  css  js  c++  java
  • ARIMA模型原理以及代码实现案例

    一、时间序列分析

    北京每年每个月旅客的人数,上海飞往北京每年的游客人数等类似这种顾客数、访问量、股价等都是时间序列数据。这些数据会随着时间变化而变化。时间序列数据的特点是数据会随时间的变化而变化。

    随机过程的特征值有均值、方差、协方差等。如果随机过程的特征随时间变化而变化,那么数据是非平稳的,相反,如果随机过程的特征随时间变化而不变化,则此过程是平稳的。

    如图所示:

    非平稳时间序列分析时,若导致非平稳的原因是确定的,可以用的方法主要有趋势拟合模型、季节调整模型、移动平均、指数平滑等。

    若导致非平稳的原因是随机的,方法主要有ARIMA,以及自回归条件异方差模型等。

    二、ARIMA

    1、简介

    ARIMA通常用于需求预测和规划中。可以用来对付随机过程的特征随着时间变化而非固定。并且导致时间序列非平稳的原因是随机而非确定的。不过,如果从一个非平稳的时间序列开始,首先需要做差分,直到得到一个平稳的序列。模型的思想就是从历史的数据中学习到随时间变化的模式,学到了就用这个规律去预测未来。

    ARIMA(p,d,q)

    • d是差分的步长(差分的阶数指的是进行多少次差分。比如步长为n的一阶差分diff(x) = f(x) - f(x - n), 而二阶步长为n的差分: diff(x) = f(x) - f(x-n), diff(x-n) = f(x-n) - f(x - n - n), diff二阶差分(x - n) = diff(x) - diff(x-n)),用来得到平稳序列
    • p为相应的自回归项
    • q是移动平均项数

    2、自回归模型AR

    自回归模型描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测。自回归模型必须满足平稳性

    自回归模型需要先确定一个阶数p,表示用几期的历史值来预测当前值。p阶自回归模型可以表示为:

    yt是当前值,u是常数项,p是阶数,r是自相关系数,e是误差

    AR的限制:

    •  自回归模型是自身的数据进行预测
    • 必须具有平稳性
    • 必须具有相关性
    • 如果自相关系数小雨0.5,则不宜采用
    • 自回归只适用于预测与自身前期相关的现象

    3、移动平均模型MA

    移动平均模型关注的自回归模型中的误差项的累加,q阶自回归过程的公式定义如下:

    移动平均模型能有效地消除预测中的随机波动

    4、自回归移动平均模型ARMA

    自回归模型AR和移动平均模型MA模型相结合,我们就得到了自回归移动平均模型ARMA(p,q),计算公式如下:

    5、p、q的确定

      (1)

      

      (2)结合最终的预测误差来确定p、q的阶数,在相同的预测误差情况下,根据奥斯卡姆剃刀准则,模型越小越好。平衡预测误差和参数个数,我们可以根据信息准则函数法,来确定模型的阶数。预测误差通常用平方误差即残差平方和来表示。

         常用的信息准则函数法:

    • ACI == 2*(模型参数个数)-2ln(模型的极大似然函数)
    • BIC = ln(n) * (模型中参数的个数)-2ln(模型的极大似然函数值),n是样本容量

    6、模型的检验

    主要的检验值:

    • 检验参数估计的显著性(t检验)
    • 检验残差序列的随机性,即残差之间是独立的

    残差序列的随机性可以通过自相关函数法来检验,即做残差的自相关函数图

    三、代码实现

    摘自kaggle一道题目。Web traffic。链接:

    https://www.kaggle.com/mohitguptaomg/simple-forecast-with-ar-ma-arima

    1、背景

    维基百科的每一个主题每一天都有一个浏览量。给定了每一个主题历史的浏览数目,让你预测一下未来这个主题浏览数目。

    2、 步骤

    • 检查数据平稳性
    • 使数据平稳
    • 对数据求差分
    • 求自相关系数和偏相关系数
    • 使用ARIMA模型

    1、检查数据平稳性并且使数据平稳, 然后对数据求差分

     1 import pandas as pd
     2 import numpy as dragon
     3 import pylab as p
     4 import matplotlib.pyplot as plot
     5 from collections import Counter
     6 from statsmodels.tsa.stattools import adfuller
     7 from statsmodels.tsa.seasonal import seasonal_decopose
     8 .....
     9 .....
    10 def test_stationarity(x):
    11     result = adfuller(x)
    12     print('ADF : %f' % result[0])
    13     print('p-value: %f' % result[1])
    14     for key, value in result[4].items():
    15         if result[0] > value:
    16             print("The data is non stationery")
    17         else:
    18             print("The data is stationery")
    19         break
    20 
    21 
    22 tv_log = dragon.log(total_view['en']) # log使数据波动幅度变小,常用处理方法
    23 tv_log_diff = tv_log - tv_log.shift() # 步长为1的差分
    24 tv_log_diff.dropna(inplaces=True)
    25 test_stationarity(tv_log_diff)

    2、求自相关系数与便相关系数

     1 from statsmodels.tsa.statools import acf, pacf
     3 
     4 lag_acf = acf(tv_log_diff, nlags=10)
     5 lag_pacf = pacf(tv_log_diff, nlags=10, method='ols')
     6 
     7 plot.subplot(1, 1, 1)
     8 plot.plot(lag_acf)
     9 
    10 plot.axhline(y=0, linestyle='--', color='g')
    11 plot.title('Autocorrelation Function')
    12 plot.show()
    13 
    14 
    15 plot.subplot(1, 1, 1)
    16 plot.plot(lag_pacf)
    17 
    18 plot.axhline(y=0, linestyle='--', color='g')
    19 plot.title('Partial Autocorrelation Function')
    20 plot.show()

    结果:

    可以看到截尾的位置均为1处,因此p,q均取1.

    3、ARIMA

     1 from statsmodels.tsa.arima_model import ARIMA
     2 from pandas import DataFrame
     3 
     4 size = int(len(tv_log - 100))
     5 train_arima, test_arima = tv_log[0:size], tv_log[size:len(tv_log)]
     6 history = [x for x in train_arima]
     7 predictions = list()
     8 originals = list()
     9 error_list = list()
    10 
    11 for t in range(len(test_arima)):
    12     # 预测一个重新训练一遍模型
    13     model = ARIMA(history, order=(1, 1, 1)) # 不要使用差分后的数据, 这里面填写的是步长为d的差分 order对应的参数(p,d, q)
    14     model_fit = model.fit(disp=0)
    15     output = model_fit.forcast()
    16     pred_value = dragon.exp(output[0])
    17     original_value = dragon.exp(test_arima[0])
    18 
    19     predictions.append(pred_value)
    20     originals.append(original_value)
    谢谢!
  • 相关阅读:
    Discuz X 2.5 点点(伪静态)
    jq 、xml 省市级联动
    php memcache 初级使用(2)
    关于windows虚拟内存管理的页目录自映射
    SharePoint 2010 网络上的开发经验和资源
    SharePoint 2010 Reporting Services 报表服务器正在内置 NT AUTHORITY\SYSTEM 账户下运行 解决方法
    SharePoint 2010 Reporting Services 报表服务器无法解密用于访问报表服务器数据库中的敏感数据或加密数据的对称密钥 解决方法
    Active Directory Rights Management Services (AD RMS)无法检索证书层次结构。 解决方法
    SharePoint 2010 Reporting Services 报表服务器实例没有正确配置 解决方法
    SharePoint 2010 页面引用 Reporting Services 展现 List 报表
  • 原文地址:https://www.cnblogs.com/ylxn/p/10750642.html
Copyright © 2011-2022 走看看