哈喽,我是cos大壮~
今儿和大家聊一个比较重要的算法模型:时间序列常用的自回归模型。
大家都知道,时间序列模型是一种用来分析时间顺序上发生的数据的方法,而自回归模型(AutoRegressive Model, AR)则是时间序列分析中的一种常见方法。为了让初次接触的同学容易理解,下面我们从两个方面来解释:概念和例子。
文末可取本文PDF版本~
概念和例子
“自回归”这个词,字面意思是“自己回归自己”。也就是说,这种模型是用过去的数值(自己过去的表现)来预测未来的数值。打个比方,假如你在看股票价格,今天的股票价格可能会受到昨天、前天,甚至更早时间的价格影响。自回归模型的核心就是利用这些过去的数据来推测未来的变化。
自回归模型通常用一个公式来表达:
是时间 时刻的值(比如今天的股票价格)。 是一个常数项。 是模型中的系数(权重),它们表明前几天的数据对今天的影响程度。 是过去 天的数值。 是一个随机误差项,代表无法通过过去数据解释的随机变化。
举一个简单的例子:
假设我们要预测一名同学最近几天的步数。我们每天都记录他走了多少步,然后希望通过这些记录来预测他明天可能走多少步。
1. 假设过去三天的数据:
三天前他走了 8000 步, 两天前他走了 8200 步, 昨天他走了 8100 步。
2. 现在我们要预测明天的步数。假设步数变化的模式是受前两天的步数影响,并且过去几天的步数加权平均可以预测出明天的步数。我们可以这样建立一个简单的自回归模型:
明天的步数 = 0.6 × 昨天的步数 + 0.3 × 前天的步数 + 一个随机的误差项。
3. 带入数据计算:
明天的步数 = 0.6 × 8100 + 0.3 × 8200 + 随机误差 计算后我们得到:明天的步数大约是 4860 + 2460 = 7320(加上随机误差后的最终预测值)。
这个简单的例子说明了自回归模型是如何用过去几天的数据来预测未来的。其实我们可以根据需要调整模型,增加考虑的天数,或者改变每一天的权重系数。
自回归模型是通过将过去的值“回归”到当前的值来进行预测。它的核心思想是,过去的数据会影响未来,利用这种关联性,我们可以对未来的情况做出推测。
下面,咱们从自回归的原理和案例都和大家讨论聊聊~
自回归(AR)原理
自回归模型的思想是当前时间序列的值可以由前面的多个时间步的值通过线性组合得到。这种模型可以表示为:
其中:
是时间 时刻的观测值(比如某天的股价)。 是常数项。 是模型参数(系数),代表前 天的观测值对当前值的影响。 是时间 时刻的观测值。 是误差项(噪声),它是独立同分布的随机变量。
公式推理
为了让模型能够捕捉到序列的动态特性,我们希望通过最小化误差平方和来拟合这些参数 和 (即线性回归的思想)。具体来说,假设我们有一个时间序列数据 ,我们希望找到使得预测误差最小的参数 和 。
通过最小二乘法,我们需要最小化目标函数:
通过对 和 求导,得到它们的最优解(类似于线性回归的求解过程)。
完整案例
接下来我们基于自回归模型的推导,用Python从零开始实现它。我们将使用Kaggle的一个时间序列数据集,具体数据集可以是 Airline Passenger Dataset。
数据集获取:点击名片,回复「数据集」即可~
1. 导入必要的库和数据集:
首先,下载并导入数据集。我们不依赖任何机器学习库,手动实现自回归模型的计算过程。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据集
df = pd.read_csv('airline-passengers.csv')
# 预处理数据
df['Month'] = pd.to_datetime(df['Month'])
df.set_index('Month', inplace=True)
# 查看数据
print(df.head())
2. 手动实现自回归模型:
构建一个简单的自回归模型,并通过梯度下降或者矩阵运算拟合参数 和 。
# 自回归模型的实现
def autoregressive_model(y, p):
"""
自回归模型: 手动拟合AR(p)
y: 时间序列数据
p: 滞后阶数
"""
T = len(y)
# 构建滞后数据矩阵 X 和目标值向量 Y
X = np.zeros((T - p, p))
Y = np.zeros(T - p)
for t in range(p, T):
X[t - p] = y[t-p:t][::-1] # 过去的p个值
Y[t - p] = y[t] # 当前的值
# 最小二乘法求解参数
X_b = np.c_[np.ones((T - p, 1)), X] # 加入常数项
theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(Y)
return theta # 返回参数 c 和 \phi_i
# 提取时间序列
y = df['Passengers'].values
p = 3 # 设定滞后阶数
# 拟合自回归模型
theta = autoregressive_model(y, p)
print(f"模型参数: {theta}")
3. 预测与绘图:
利用模型参数进行预测,并绘制多个数据分析图形,包括原始数据、预测值、残差分析等。
# 预测函数
def predict_ar(y, theta, p):
T = len(y)
y_pred = np.zeros(T - p)
for t in range(p, T):
X_t = np.r_[1, y[t-p:t][::-1]]
y_pred[t - p] = X_t.dot(theta)
return y_pred
# 获取预测值
y_pred = predict_ar(y, theta, p)
# 绘制图形
plt.figure(figsize=(15, 10))
# 图1:原始时间序列与预测值对比
plt.subplot(2, 2, 1)
plt.plot(df.index[p:], y_pred, label='Predicted', color='red', linestyle='--')
plt.plot(df.index, y, label='Original', color='blue')
plt.title('Original vs Predicted')
plt.xlabel('Date')
plt.ylabel('Passengers')
plt.legend()
# 图2:残差分析
residuals = y[p:] - y_pred
plt.subplot(2, 2, 2)
plt.plot(df.index[p:], residuals, color='purple')
plt.title('Residuals')
plt.xlabel('Date')
plt.ylabel('Error')
# 图3:残差的分布
plt.subplot(2, 2, 3)
plt.hist(residuals, bins=30, color='green')
plt.title('Residuals Distribution')
plt.xlabel('Error')
plt.ylabel('Frequency')
# 图4:残差的自相关分析
from statsmodels.graphics.tsaplots import plot_acf
plt.subplot(2, 2, 4)
plot_acf(residuals, lags=20, ax=plt.gca(), color='orange')
plt.title('Residuals Autocorrelation')
plt.tight_layout()
plt.show()
通过代码,咱们简单分析一下:
1. 原始数据与预测数据对比图:展示了模型预测的结果与实际数据的差异,帮助我们直观地观察模型的拟合效果。
2. 残差分析图:显示了预测值与实际值之间的误差,这个图帮助我们判断模型是否存在系统性误差。
3. 残差的分布图:通过观察残差的分布,可以判断模型误差是否符合正态分布,如果不符合,则说明模型可能存在改进空间。
4. 残差自相关图:如果残差存在自相关性,说明模型未能捕捉到数据中的全部信息,可能还需要引入更多滞后项或其他模型。
最后
大家有问题可以直接在评论区留言即可~
喜欢本文的朋友可以收藏、点赞、转发起来!
推荐阅读
原创、超强、精华合集 100个超强机器学习算法模型汇总 机器学习全路线 机器学习各个算法的优缺点 7大方面,30个最强数据集 6大部分,20 个机器学习算法全面汇总 铁汁,都到这了,别忘记点赞呀~