突破最强时间序列模型,自回归滑动平均!!

文摘   2024-10-29 15:46   北京  

哈喽,我是cos大壮~

今儿和大家再来聊聊时间序列中,比较重要的一个算法模型:自回归滑动平均。

自回归滑动平均模型,英文叫 ARMA 模型。这个模型是用来分析和预测时间序列数据的,比如股市的价格波动、温度变化等。

下面,我们会分两个部分来解释:「自回归」和「滑动平均」,然后再看它们怎么结合成一个模型。

老规矩如果大家伙觉得近期文章还不错!欢迎大家点个赞、转个发,文末赠送《机器学习学习小册》

文末可取本文PDF版本~

1. 什么是「时间序列」?

时间序列就是随着时间变化的数据。例如:

  • 每天的气温记录
  • 每小时的股票价格
  • 每周的店铺销售额

这些数据都有一个特点——它们是按照时间顺序排列的,并且通常前面的数据会影响后面的数据。

2. 自回归(AutoRegressive,简称AR)

自回归的意思是“自己回归自己”。简单来说,就是用之前的数据去预测现在的值。

举个例子:你每天记录午饭花的钱,发现花的金额有个规律——今天的花费和前几天的花费有关系。比如,昨天和前天的花费可能会影响今天的花费。如果前两天花得比较多,今天可能会稍微省一点;反之,如果前几天没花多少,今天可能会多花一些。

在数学上,自回归可以表示为:

其中:

  • :表示当前的值(比如今天花的钱)。
  • :分别是前一天、前两天到前  天的值。
  • :是一些系数,表示过去的数据对现在的影响程度。
  • :是误差项,表示一些不可预测的随机因素。

自回归就是通过前几天的数据来预测今天的值,类似于“靠前几天的自己,来预测今天的自己”。

3. 滑动平均(Moving Average,简称MA)

滑动平均就是用之前的“误差”来调整当前的预测。

再用午饭花费举例:假设你每天都会做预算,但有时会因为一些突发情况(比如今天特别饿,或者看到喜欢的菜)而多花了钱。这些“意外的误差”会影响你接下来的花费。

滑动平均的公式看起来是这样的:

其中:

  • :表示当前的值。
  • :是一个常数,代表数据的平均水平。
  • :分别是昨天、前天等之前的误差。
  • :是一些系数,表示这些误差对当前值的影响大小。

滑动平均就是利用之前“预算偏差”来调整今天的预算,类似于“回顾前几天的误差,来修正今天的自己”。

4. 自回归滑动平均模型(ARMA)

现在,我们来把「自回归」和「滑动平均」结合起来。ARMA 模型就是在用前几天的数值(自回归)做预测的同时,还考虑到之前误差的影响(滑动平均),得到一个更准确的预测模型。

公式表示

通过 ARMA 模型,我们既利用了过去的数据趋势(自回归),也参考了之前的误差(滑动平均),让预测更接近真实情况。

举个简单的小例子

假设我们记录了过去几天的气温变化,发现今天的气温和前两天的气温(自回归部分)以及前一天的误差(滑动平均部分)有关。

假设:

  •  度(昨天的气温)
  •  度(前天的气温)
  •  度(昨天预测的误差)

如果我们假设模型系数为 ,模型预测今天的气温就是:

这样,我们就得到了一个基于 ARMA 模型的预测。

事实上,ARMA 模型是一种结合自回归和滑动平均的方法,能够利用历史数据的趋势和误差去预测未来值。

下面,咱们从原理和案例方面再来和大家聊聊~

ARMA 模型

ARMA 模型结合了两部分:自回归 (AR) 和 滑动平均 (MA)。

假设:

  • 时间序列  是一个平稳时间序列,即均值和方差随时间稳定。
  • AR 模型阶数为 ,MA 模型阶数为 ,我们有:

1. 自回归部分 (AR)

自回归模型通过先前的序列值来预测当前值,公式为:

其中, 是自回归系数, 是随机误差项。

2. 滑动平均部分 (MA)

滑动平均模型使用过去的误差项预测当前值:

其中, 是滑动平均系数, 是常数项,表示序列的均值。

3. 综合 AR 和 MA

综合 AR 和 MA 两部分后,得到 ARMA 模型公式:

数据集选择和下载

我们在 Kaggle 上选择一个合适的时间序列数据集,如「每日温度」、「股票价格」等。之后手动实现 ARMA 模型并通过图表展示分析结果。

Python实现

首先,咱们使用 daily-min-temperatures.csv 数据集。

大家可以点击名片,回复「数据集」进行获取~

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 读取数据集
data = pd.read_csv('daily-min-temperatures.csv', parse_dates=['Date'], index_col='Date')
temperature = data['Temp'].values

# 绘制时间序列图
plt.figure(figsize=(106))
plt.plot(data.index, temperature, color='dodgerblue')
plt.title("Daily Minimum Temperatures")
plt.xlabel("Date")
plt.ylabel("Temperature")
plt.show()

# 绘制自相关和偏自相关图
plt.figure(figsize=(125))
plt.subplot(121)
plot_acf(temperature, lags=30, color='blue', ax=plt.gca())
plt.title("Autocorrelation (ACF)")

plt.subplot(122)
plot_pacf(temperature, lags=30, color='red', ax=plt.gca())
plt.title("Partial Autocorrelation (PACF)")
plt.tight_layout()
plt.show()

# 初始化ARMA模型参数
p, q = 22  # 设置自回归和滑动平均的阶数
phi = np.random.randn(p)
theta = np.random.randn(q)
mu = np.mean(temperature)
n = len(temperature)

# 自定义 ARMA 模型拟合函数
def arma_model(temperature, phi, theta, p, q):
    Y_pred = np.zeros(n)
    residuals = np.zeros(n)
    
    for t in range(max(p, q), n):
        ar_term = np.sum([phi[i] * temperature[t - i - 1for i in range(p)])
        ma_term = np.sum([theta[i] * residuals[t - i - 1for i in range(q)])
        Y_pred[t] = mu + ar_term + ma_term
        residuals[t] = temperature[t] - Y_pred[t]  # 计算残差
    return Y_pred, residuals

# 预测并计算残差
Y_pred, residuals = arma_model(temperature, phi, theta, p, q)

# 绘制拟合效果图
plt.figure(figsize=(106))
plt.plot(data.index, temperature, label="Original", color='dodgerblue')
plt.plot(data.index, Y_pred, label="ARMA Fit", color='coral')
plt.title("ARMA Model Fitting")
plt.xlabel("Date")
plt.ylabel("Temperature")
plt.legend()
plt.show()

# 绘制残差图
plt.figure(figsize=(106))
plt.plot(data.index, residuals, color='purple')
plt.title("Residuals of ARMA Model")
plt.xlabel("Date")
plt.ylabel("Residuals")
plt.show()

1. 时间序列原始数据图:展示温度随时间的变化趋势,分析季节性和周期性。

2. 自相关图 (ACF):展示滞后值与当前值的关系,帮助决定 AR 模型阶数。

3. 偏自相关图 (PACF):观察自回归的影响,帮助选择 AR 部分的阶数。

4. 残差图:观察 ARMA 模型残差的分布是否随机,验证模型的拟合效果。

最后

通过手动实现 ARMA 模型,可以深刻理解其数学推导和实现细节,同时通过图形直观地理解模型的拟合效果和残差分布。

大家有问题可以直接在评论区留言即可~

喜欢本文的朋友可收藏、点赞、转发起来!

需要本文PDF的同学,扫码备注「基础算法」即可~ 
关注本号,带来更多算法干货实例,提升工作学习效率!
最后,给大家准备了《机器学习学习小册》PDF版本16大块的内容,124个问题总结
100个超强算法模型,大家如果觉得有用,可以点击查看~

推荐阅读

原创、超强、精华合集
100个超强机器学习算法模型汇总
机器学习全路线
机器学习各个算法的优缺点
7大方面,30个最强数据集
6大部分,20 个机器学习算法全面汇总
铁汁,都到这了,别忘记点赞呀~

深夜努力写Python
Python、机器学习算法
 最新文章