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