哈喽,我是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=(10, 6))
plt.plot(data.index, temperature, color='dodgerblue')
plt.title("Daily Minimum Temperatures")
plt.xlabel("Date")
plt.ylabel("Temperature")
plt.show()
# 绘制自相关和偏自相关图
plt.figure(figsize=(12, 5))
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 = 2, 2 # 设置自回归和滑动平均的阶数
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 - 1] for i in range(p)])
ma_term = np.sum([theta[i] * residuals[t - i - 1] for 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=(10, 6))
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=(10, 6))
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 模型,可以深刻理解其数学推导和实现细节,同时通过图形直观地理解模型的拟合效果和残差分布。
大家有问题可以直接在评论区留言即可~
喜欢本文的朋友可以收藏、点赞、转发起来!
推荐阅读
原创、超强、精华合集 100个超强机器学习算法模型汇总 机器学习全路线 机器学习各个算法的优缺点 7大方面,30个最强数据集 6大部分,20 个机器学习算法全面汇总 铁汁,都到这了,别忘记点赞呀~