赞
踩
时序数据(Time Series)是指随着时间推移而变化的数据。与传统的静态数据不同的是,时序数据的特点是存在一定的顺序性和时间关联性,因而可以对其进行精确、高效的分析和预测。如日线、分钟线、时序图等。一般来说,对时序数据进行分析和预测主要包括以下几个方面:
时序数据(Time Series)是指随着时间推移而变化的数据。时序数据的特点是存在一定的顺序性和时间关联性,因而可以对其进行精确、高效的分析和预测。它包含两个部分:时间(Time)和变量(Variable)。如下图所示:
上图显示了一个时间序列图。每一条曲线代表一个变量(X),按时间顺序记录了这个变量随时间变化的值(Y)。横轴表示时间,纵轴表示变量。
时间序列模型用于描述时间序列数据中的趋势、季节性、周期性、随机性等。有多种时间序列模型可供选择,如平均趋势法(AR)、移动平均模型(MA)、指数平滑模型(ARIMA)、autoregressive integrated moving average(ARIMAS)等。其中,平均趋势法(AR)、移动平均模型(MA)、指数平滑模型(ARIMA)属于平稳模型,也就是说它们都是时间序列模型中自回归模型(AR)、移动平均模型(MA)、指数平滑模型(MA)的综合体。
时序预测(Time series prediction)是对未来时间点的数值进行预测。时序预测是一个极具挑战性的问题,因为它的目标就是要正确地预测出一个未知的时间点的数值。时序预测可以分为两类:监督时序预测(Supervised Time series Prediction)和非监督时序预测(Unsupervised Time series Prediction)。
监督时序预测是在已知某些历史数据的情况下,对未来的数值进行预测。已知历史数据一般由时间序列作为输入,输出则是一个未知的时间点的真实值。监督时序预测的目标是使预测值与实际值之间的误差最小化。有多种监督时序预测算法可用,如线性回归、决策树、神经网络、支持向量机(SVM)、递归神经网络(RNN)、堆叠自动编码器(Stacked AutoEncoder,简称SAAE)、长短期记忆网络(LSTM)等。
非监督时序预测是不需要任何先验信息就可以对时间序列进行分析和预测。常见的方法有聚类、降维、自编码器(AutoEncoder)、变换方法(变换+聚类、变换+自编码器、游走模型、贝叶斯变换)等。
AR(Autoregression)算法是最简单的监督时序预测算法之一。它假设一个固定的一阶方程的信号的残差序列即下一时刻的状态仅仅取决于过去的一个或多个时刻的状态,并且对预测结果进行了一定程度的限制。
AR模型可以表示如下:
y(t)=c+a1y(t−1)+···+an-1y(t−n+1)+e(t), e(t)∼iid(0,σ^2)
其中,y(t)是观察变量,c是截距项,α1,...,αn-1是AR系数,e(t)是白噪声项,σ^2是平方根噪声项的方差。
求解AR模型,通常采用最小二乘法或梯度下降法等。下面我们首先讨论梯度下降法。
梯度下降法用于求解AR模型的参数,根据AR模型的数学表达式,其参数估计值可以通过迭代计算得到。具体地,我们希望找到使得拟合误差最小的θ值。
首先,初始化θ=[c,α1,...,αn-1],令η=0.1,步长=η/||J(θ)||,其中,||.||表示范数。
然后,重复执行以下步骤直至收敛:
其中,ε是一个正则化参数,通常取一个很小的值,0<ε<<1;f(θ)是AR模型的函数形式,θ'Φ(θ-θ0)是AR模型的Hessian矩阵的负半期矩阵。
其中,J'(θ)是J(θ)的导数。
在矩阵运算方面,AR算法对角线上为[1,-ρ...-ρ]^T,其余位置为0,ρ为白噪声项方差;上三角阵为[-1,...-1],其余位置为0;负半期阵Φ为[θ1'Ωθ1,0,...,0].T。利用numpy库可以轻松实现矩阵运算。具体的Python代码如下:
import numpy as np def ar_model(y): n = len(y) # 样本长度 p = 1 # 预测步长 c, a, e = y[0], [], [] for i in range(p,n): r = y[i]-np.dot([1]+a[:-1],y[i-p:i][::-1])+c e.append(r) c += r return e def estimate_ar(y, order, iterations): m = [[]]*order def phi(x, t, o): if x == 0 and t < o: return 0 elif x >= o - 1 and t > len(m[o]) + o - 2: return 0 else: return m[o][t-x] for j in range(iterations): e = y.copy() for o in range(order): m[o] = [sum((phi(j-k, i, o)*e[i] for k in range(len(m[o])))) for i in range(o,len(e))] theta = list(range(-o,0))+list(range(1,order+1)) s = sum((-theta[l]**2/(2*(phi(j, l, o)**2+(y[0]*phi(j-l, 0, o))**2))* ((y[l+j]**2)/phi(j, l, o)+(y[0]*y[l+j])/phi(j, 0, o))) for l in range(len(theta))) e -= s*(m[o]) return e y = [1,2,3,4,5] # 测试数据 e = ar_model(y) # 残差序列 ehat = estimate_ar(e, 1, 10000) # AR模型预测残差序列 yp = [(ehat[i] + y[0] * y[-i-1]) for i in range(len(ehat))] # 预测值序列 print("AR模型预测值序列:", yp)
ARIMA(Autoregressive Integrated Moving Average,自回归整合移动平均)是一种时间序列预测算法,既可以用于训练模型,也可以用于预测未来的数值。它由三个参数决定:(p,d,q),分别对应于模型中的AR、I(差分)、MA。
ARIMA模型可以表示如下:
Y_t=c+ɑ(L)Y_(t−1)+εt+θ(D)[εt−1]+μ(Q)[εt−q]
其中,Y_t是观察变量,Y_(t-1)是历史观察变量,εt是白噪声项,L为阶数,θ(D)为Differencing Matrix,D是差分阶数,μ(Q)为Moving Average Matrix,Q是移动平均阶数。
ARIMA模型的求解可以直接采用卡尔曼滤波器(Kalman Filter)算法。卡尔曼滤波器是最常用的时间序列预测算法之一。
卡尔曼滤波器是基于线性动态系统的状态空间模型,它能够处理高斯白噪声、非线性系统以及同时观察多个系统。其工作原理如下:
ARIMA模型的求解需要先确定p、d、q三个参数,然后通过确定下面的公式来计算A、B、C矩阵:
P_k=A^TK^{-1}(A^TP_k+λP_k^Ta)^{-1}
K_k=C^T(CP_k+vP_k^Tc)^{-1}
λ=trace(P_kp_kp^TA)^-1
A=θ(D)^Lp B=(I−θ(D)^LA)^Lp−1 C=μ(Q)
θ(D)为θ阶差分矩阵,θ(D)=-1表示无差分,θ(D)=0表示一阶差分,θ(D)=1表示二阶差分,θ(D)>=2表示多阶差分;μ(Q)为μ阶移动平均矩阵;p、q、d分别为模型的AR、MA、差分阶数。
下面我们用statsmodels库中的sarimax模块来实现ARIMA模型,该模块内置了卡尔曼滤波器算法。
import pandas as pd from statsmodels.tsa.statespace.sarimax import SARIMAX data = pd.read_csv('test.csv') train = data['value'][:int(len(data)*0.7)] test = data['value'][int(len(data)*0.7):] # 创建SARIMA模型 model = SARIMAX(train, order=(1, 1, 1), trend='ct', seasonal_order=(0, 0, 1, 7)) result = model.fit() # 用测试集预测 forecast = result.predict(start=int(len(train)), end=int(len(train)+len(test)-1), typ='levels').values.tolist() rmse = np.sqrt(mean_squared_error(test, forecast)) mape = mean_absolute_percentage_error(test, forecast) print("RMSE:", rmse) print("MAPE:", mape)
这是使用Python和Pandas库实现时序预测模型AR算法的简单例子。
import pandas as pd import matplotlib.pyplot as plt # 生成时序数据 df = pd.DataFrame({'value': [1, 2, 3, 4, 5]}) # 数据可视化 plt.plot(df['value']) plt.show() # 通过AR模型预测未来值 p = 1 # 预测步长 predictions = [] actuals = df['value'].to_list() for i in range(p, len(actuals)): predictions.append(df['value'].iloc[i-p:i].mean()) future_df = pd.DataFrame({ 'Actual Values': actuals[p:], 'Predictions': predictions}) plt.plot(future_df[['Actual Values']]) plt.plot(future_df[['Predictions']]) plt.legend(['Actual Values', 'Predictions']) plt.title('Predicting future values using AR Model') plt.xlabel('Time Step') plt.ylabel('Value') plt.show()
这里生成了一个包含时序数据的DataFrame,然后展示了原始数据。接着通过AR模型,使用之前的数据来预测未来值。最后展示了预测值和真实值之间的对比图。
这是使用Python和Statsmodels库实现ARIMA算法的简单例子。
import pandas as pd import matplotlib.pyplot as plt import statsmodels.api as sm # 生成时序数据 df = pd.DataFrame({'value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}) # 数据可视化 fig, ax = plt.subplots(figsize=(12, 8)) ax.set(title="Original time series", xlabel="Time step", ylabel="Value") sm.graphics.tsa.plot_acf(df["value"].squeeze(), lags=30, ax=ax) # 通过ARIMA模型预测未来值 model = sm.tsa.statespace.SARIMAX(df['value'], order=(1, 1, 1), seasonal_order=(0, 0, 1, 2)) results = model.fit() prediction = results.get_forecast(steps=len(df)) predicted_df = prediction.summary_frame().transpose() predicted_df.rename({"mean": "Prediction"}, inplace=True, axis=1) # 将预测值与实际值画图比较 actual = df['value'].reset_index()['value'] predicted_df['Time'] = predicted_df.index actual.name = "Actual" predicted_df = pd.concat([actual, predicted_df], axis=1) predicted_df.head(10).plot(x="Time", title="Forecast vs Actual value") plt.show()
这里生成了一个包含时序数据的DataFrame,然后展示了原始数据和相关性。接着通过ARIMA模型,使用之前的数据来预测未来值。最后展示了预测值和真实值之间的对比图。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。