当前位置:   article > 正文

Python 人工智能实战:时序预测_ai基于时间序列预测真实代码分析案例

ai基于时间序列预测真实代码分析案例

1.背景介绍

时序数据(Time Series)是指随着时间推移而变化的数据。与传统的静态数据不同的是,时序数据的特点是存在一定的顺序性和时间关联性,因而可以对其进行精确、高效的分析和预测。如日线、分钟线、时序图等。一般来说,对时序数据进行分析和预测主要包括以下几个方面:

  • 时序建模(Time series modeling):构建时间序列模型,对数据中的趋势、季节性、周期性、随机性等进行建模;
  • 时序预测(Time series prediction):对未来时间点的数值进行预测;
  • 时序监控(Time series monitoring):对数据的异常、异常检测、评价模型性能、趋势判断等;
  • 时序分类(Time series classification):根据给定数据将其划分到不同的类别中。 时序预测是人工智能领域的一项重要研究方向,也是机器学习和深度学习技术在时序预测任务上的应用。本文旨在通过实例学习如何运用Python实现时序预测任务,并基于相关主题提供解决方案。

2.核心概念与联系

2.1 时序数据

时序数据(Time Series)是指随着时间推移而变化的数据。时序数据的特点是存在一定的顺序性和时间关联性,因而可以对其进行精确、高效的分析和预测。它包含两个部分:时间(Time)和变量(Variable)。如下图所示:

上图显示了一个时间序列图。每一条曲线代表一个变量(X),按时间顺序记录了这个变量随时间变化的值(Y)。横轴表示时间,纵轴表示变量。

2.2 时间序列模型

时间序列模型用于描述时间序列数据中的趋势、季节性、周期性、随机性等。有多种时间序列模型可供选择,如平均趋势法(AR)、移动平均模型(MA)、指数平滑模型(ARIMA)、autoregressive integrated moving average(ARIMAS)等。其中,平均趋势法(AR)、移动平均模型(MA)、指数平滑模型(ARIMA)属于平稳模型,也就是说它们都是时间序列模型中自回归模型(AR)、移动平均模型(MA)、指数平滑模型(MA)的综合体。

2.3 时序预测

时序预测(Time series prediction)是对未来时间点的数值进行预测。时序预测是一个极具挑战性的问题,因为它的目标就是要正确地预测出一个未知的时间点的数值。时序预测可以分为两类:监督时序预测(Supervised Time series Prediction)和非监督时序预测(Unsupervised Time series Prediction)。

2.3.1 监督时序预测

监督时序预测是在已知某些历史数据的情况下,对未来的数值进行预测。已知历史数据一般由时间序列作为输入,输出则是一个未知的时间点的真实值。监督时序预测的目标是使预测值与实际值之间的误差最小化。有多种监督时序预测算法可用,如线性回归、决策树、神经网络、支持向量机(SVM)、递归神经网络(RNN)、堆叠自动编码器(Stacked AutoEncoder,简称SAAE)、长短期记忆网络(LSTM)等。

2.3.2 非监督时序预测

非监督时序预测是不需要任何先验信息就可以对时间序列进行分析和预测。常见的方法有聚类、降维、自编码器(AutoEncoder)、变换方法(变换+聚类、变换+自编码器、游走模型、贝叶斯变换)等。

3.核心算法原理和具体操作步骤以及数学模型公式详细讲解

3.1 AR算法

AR(Autoregression)算法是最简单的监督时序预测算法之一。它假设一个固定的一阶方程的信号的残差序列即下一时刻的状态仅仅取决于过去的一个或多个时刻的状态,并且对预测结果进行了一定程度的限制。

3.1.1 模型定义

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是平方根噪声项的方差。

3.1.2 模型求解

求解AR模型,通常采用最小二乘法或梯度下降法等。下面我们首先讨论梯度下降法。

(1)梯度下降法

梯度下降法用于求解AR模型的参数,根据AR模型的数学表达式,其参数估计值可以通过迭代计算得到。具体地,我们希望找到使得拟合误差最小的θ值。

首先,初始化θ=[c,α1,...,αn-1],令η=0.1,步长=η/||J(θ)||,其中,||.||表示范数。

然后,重复执行以下步骤直至收敛:

  1. J(θ)=ε||y-f(θ)||^2+0.5*(θ-θ0)'Φ(θ-θ0) (3.1)

其中,ε是一个正则化参数,通常取一个很小的值,0<ε<<1;f(θ)是AR模型的函数形式,θ'Φ(θ-θ0)是AR模型的Hessian矩阵的负半期矩阵。

  1. θ=θ-步长*J'(θ)

其中,J'(θ)是J(θ)的导数。

  1. 若||J(θ)||<ε,则停止迭代。
(2)矩阵运算与Python实现

在矩阵运算方面,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) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

3.2 ARIMA算法

ARIMA(Autoregressive Integrated Moving Average,自回归整合移动平均)是一种时间序列预测算法,既可以用于训练模型,也可以用于预测未来的数值。它由三个参数决定:(p,d,q),分别对应于模型中的AR、I(差分)、MA。

3.2.1 模型定义

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是移动平均阶数。

3.2.2 模型求解

ARIMA模型的求解可以直接采用卡尔曼滤波器(Kalman Filter)算法。卡尔曼滤波器是最常用的时间序列预测算法之一。

(1)卡尔曼滤波器

卡尔曼滤波器是基于线性动态系统的状态空间模型,它能够处理高斯白噪声、非线性系统以及同时观察多个系统。其工作原理如下:

  1. 初始化时刻t=1处的观测值及其协方差Γ
  2. 对t>1时刻的观测值及其协方差做一阶低通滤波,得到φ=(α^-1Γ^-1)(α^-1y_t+β^-1z_t),z_t是观测值加上噪声的过程。
  3. 根据平方差公式计算t-1时刻估计值的协方差Γ,Γ=ψΓψ^T+γϕϕ^T
  4. 计算t时刻估计值φ=aphi+bpsi
  5. 更新状态变量,y_t=ay_{t-1}+by_t−1+cx_t
  6. 更新观测值及其协方差Γ
(2)ARIMA模型求解

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、差分阶数。

(3)Python实现

下面我们用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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

4.具体代码实例和详细解释说明

4.1 使用Python和Pandas库实现时序预测模型AR算法

这是使用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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

这里生成了一个包含时序数据的DataFrame,然后展示了原始数据。接着通过AR模型,使用之前的数据来预测未来值。最后展示了预测值和真实值之间的对比图。

4.2 使用Python和Statsmodels库实现ARIMA算法

这是使用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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

这里生成了一个包含时序数据的DataFrame,然后展示了原始数据和相关性。接着通过ARIMA模型,使用之前的数据来预测未来值。最后展示了预测值和真实值之间的对比图。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/167843
推荐阅读
相关标签
  

闽ICP备14008679号