博客
关于我
python之时间序列算法(ARMA)
阅读量:237 次
发布时间:2019-03-01

本文共 2801 字,大约阅读时间需要 9 分钟。

关于时间序列算法的分类与分析

传统的统计学方法是处理时间序列的重要方式之一。这些方法可以追溯到随机游走模型(RW)、历史平均模型(HA)、马尔科夫模型、时间序列模型以及卡尔曼滤波模型。RW和HA依赖于理论假设,未能充分考虑交通流量的波动性,导致预测结果与实际数据差异较大。而马尔科夫模型、时间序列模型和卡尔曼滤波模型则基于现有道路交通流量数据,假定数据符合某种概率分布,从而进行模型训练和参数估计。

ARMA模型介绍

ARMA模型是一种经典的统计学时间序列模型,其名称由AR(自回归模型)和MA(移动平均模型)两个部分组成。AR模型假设时间序列的值主要受到过去若干期的影响,误差项则视为当期的随机扰动。MA模型则假设误差项主要受到过去若干期随机扰动的影响。

AR模型的数学表达式为:[ X(t) = \phi_1 X(t-1) + \phi_2 X(t-2) + \dots + \phi_p X(t-p) + \varepsilon(t) ]其中,(\phi_1, \phi_2, \dots, \phi_p) 是自回归系数,(\varepsilon(t)) 是随机扰动项。

MA模型的数学表达式为:[ X(t) = \theta_1 \varepsilon(t-1) + \theta_2 \varepsilon(t-2) + \dots + \theta_q \varepsilon(t-q) ]其中,(\theta_1, \theta_2, \dots, \theta_q) 是移动平均系数。

ARMA模型结合了AR和MA的优势,整体表达式为:[ X(t) = \phi_1 X(t-1) + \phi_2 X(t-2) + \dots + \phi_p X(t-p) + \theta_1 \varepsilon(t-1) + \theta_2 \varepsilon(t-2) + \dots + \theta_q \varepsilon(t-q) ]

非平稳时间序列分析

在实际应用中,大部分时间序列数据都是非平稳的。非平稳时间序列分析主要包括两类:

  • 确定性因素分析:将时间序列的变化归结为长期趋势、季节变动、循环变动和随机波动四个因素的综合影响。其中,长期趋势和季节变动较为明显,而循环变动和随机波动难以确定。

  • 随机时序分析:针对确定性因素分析的不足,使用随机序列模型进行分析。常用的模型包括ARIMA、季节模型、异方差模型等。ARIMA模型通过差分运算将非平稳序列转化为平稳序列,再进行建模。ARIMA模型的核心是对非平稳序列进行差分处理,得到差分平稳序列后,使用ARMA模型进行拟合。

  • ARMA模型案例

    以Python的statsmodels库为例,以下是一个典型的ARMA模型应用案例:

    数据准备

    读取数据文件,包含日期和销量数据。

    import pandas as pdimport matplotlib.pyplot as pltfrom statsmodels.graphics.tsaplots import plot_acf, plot_pacf# 读取数据文件discfile = 'data/arima_data.xls'data = pd.read_excel(discfile, index_col='日期')# 设置中文支持plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 可视化数据data.plot()plt.show()

    平稳性检验

    通过自相关函数(ACF)和ADF检验发现数据呈现明显的非平稳性。

    # 自相关图plot_acf(data).show()# ADF检验from statsmodels.tsa.stattools import adfullerprint('原始序列的ADF检验结果为:', adfuller(data['销量']))

    差分与平稳性检验

    对数据进行一阶差分,得到差分序列,进一步验证平稳性。

    # 一阶差分D_data = data.diff().dropna()D_data.columns = ['销量差分']# 可视化差分序列D_data.plot()plt.show()# 自相关图plot_acf(D_data).show()# 偏自相关图plot_pacf(D_data).show()# 平稳性检验print('差分序列的ADF检验结果为:', adfuller(D_data['销量差分']))

    白噪声检验

    检验差分序列是否为白噪声,结果显示非白噪声。

    from statsmodels.stats.diagnostic import acorr_ljungbox# 白噪声检验print('差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1))

    ARMA模型定阶

    通过BIC信息量检验确定模型的自回归阶数(p)和移动平均阶数(q)。

    # 定阶pmax = int(len(D_data)/10)qmax = int(len(D_data)/10)bic_matrix = []for p in range(pmax + 1):    tmp = []    for q in range(qmax + 1):        try:            model = ARIMA(D_data, (p, 1, q)).fit()            tmp.append(model.bic)        except:            tmp.append(None)    bic_matrix.append(tmp)bic_matrix = pd.DataFrame(bic_matrix)p, q = bic_matrix.stack().idxmin()print('BIC最小的p值和q值为:%s、%s' % (p, q))

    模型应用

    使用确定的(p=0)和(q=1)阶数,建立ARIMA(0,1,1)模型进行预测。

    model = ARIMA(data, (0, 1, 1)).fit()# 模型报告print('模型报告为:\n', model.summary2())# 预测未来5天forecasts = model.forecast(5)print('预测结果及信息:\n', forecasts)

    总结

    通过上述步骤,我们可以清晰地看到ARMA模型在处理非平稳时间序列数据中的应用。尽管传统方法如ARMA模型在某些场景下表现优异,但在复杂场景下深度学习模型(如LSTM、GRU、TCN等)往往更具优势。

    转载地址:http://gnpv.baihongyu.com/

    你可能感兴趣的文章
    nump模块
    查看>>
    Nutch + solr 这个配合不错哦
    查看>>
    NuttX 构建系统
    查看>>
    NutUI:京东风格的轻量级 Vue 组件库
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NutzWk 5.1.5 发布,Java 微服务分布式开发框架
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    Nuxt Time 使用指南
    查看>>
    NuxtJS 接口转发详解:Nitro 的用法与注意事项
    查看>>
    NVelocity标签使用详解
    查看>>
    NVelocity标签设置缓存的解决方案
    查看>>
    Nvidia Cudatoolkit 与 Conda Cudatoolkit
    查看>>
    NVIDIA GPU 的状态信息输出,由 `nvidia-smi` 命令生成
    查看>>
    NVIDIA-cuda-cudnn下载地址
    查看>>
    nvidia-htop 使用教程
    查看>>
    nvidia-smi 参数详解
    查看>>
    Nvidia驱动失效,采用官方的方法重装更快
    查看>>
    nvmw安装node-v4.0.0之后版本的临时解决办法
    查看>>
    nvm切换node版本
    查看>>
    nvm安装 出现 Error retrieving “http://xxxx/SHASUMS256.txt“: HTTP Status 404 解决方法
    查看>>