突破长短期记忆网络——LSTM与ARIMA结合的时间序列预测原理

薛定谔了么
2025-10-29 01:49:54
人工智能
技术教程
本帖最后由 薛定谔了么 于 2025-10-29 01:49 编辑


时间序列数据具有时间依赖性与趋势性,因此需要结合不同的建模方法来捕捉其特性。传统的时间序列模型如ARIMA(自回归积分滑动平均模型)擅长处理线性时间序列,而现代深度学习方法如LSTM(长短期记忆网络)对非线性特征表现出色。



  ARIMA与LSTM结合的基本思路


将时间序列的线性和非线性特性分离:


线性部分建模:使用ARIMA提取时间序列中的线性模式。


非线性部分建模:通过对ARIMA残差(预测误差)进行分析,用LSTM捕捉残差中的非线性结构。


结合两者的方法:



通过这种方式,可以充分利用两种模型的优势。


  ARIMA与LSTM的数学公式


1. ARIMA模型


ARIMA的基本形式为:



ARIMA的目标是通过参数估计找到合适的Φ、θ和d,拟合线性部分。


2. LSTM模型


LSTM是RNN的一种改进结构,用于长时间依赖的非线性序列建模:



LSTM对ARIMA残差进行建模时,以ARIMA的预测残差作为输入,预测未来的非线性残差。


  LSTM与ARIMA结合的特殊注意点


数据平稳性:ARIMA需要输入的时间序列是平稳的,可能需要进行差分处理,而LSTM对非平稳数据的处理能力更强。


残差的处理:ARIMA建模的残差必须具有非线性特征,否则LSTM的加入不会显著提高预测效果。


模型顺序性:先通过ARIMA提取线性趋势,再将残差输入LSTM。


数据规模:LSTM训练需要较大的数据规模,而ARIMA可以在小样本下表现良好。


参数调优:需要分别对ARIMA和LSTM进行优化,避免模型复杂性过高或过拟合。


  案例分析


LSTM与ARIMA结合预测股票价格


1. 数据集生成


假设虚拟的股票数据集,包含每日的股票收盘价。


2. Python代码实现


代码部分包含数据生成、模型构建、训练以及可视化。


import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
import torch
import torch.nn as nn
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error

# 数据生成
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=200)
prices = 100 + np.cumsum(np.random.normal(0, 1, 200))  # 模拟股票价格
data = pd.DataFrame({'Date': dates, 'Price': prices})

# 数据可视化
plt.figure(figsize=(10, 4))
plt.plot(data['Date'], data['Price'])
plt.title("Simulated Stock Prices")
plt.xlabel("Date")
plt.ylabel("Price")
plt.grid()
plt.show()

# ARIMA建模
train_size = int(len(prices) * 0.8)
train, test = prices[:train_size], prices[train_size:]

# ARIMA拟合
arima_model = ARIMA(train, order=(5, 1, 0))
arima_result = arima_model.fit()
arima_forecast = arima_result.forecast(steps=len(test))

# 残差提取
residuals = test - arima_forecast

# LSTM建模
scaler = MinMaxScaler()
scaled_residuals = scaler.fit_transform(residuals.reshape(-1, 1))

# 数据准备
def create_sequences(data, seq_length):
    sequences = []
    for i in range(len(data) - seq_length):
        sequences.append((data[i:i + seq_length], data[i + seq_length]))
    return sequences

seq_length = 10
sequences = create_sequences(scaled_residuals, seq_length)
X, y = zip(*sequences)
X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.float32)

# LSTM模型定义
class LSTMModel(nn.Module):
    def __init__(self, input_size=1, hidden_size=50, output_size=1):
        super(LSTMModel, self).__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        _, (hn, _) = self.lstm(x)
        out = self.fc(hn[-1])
        return out

# 模型实例化
model = LSTMModel()
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

# 模型训练
epochs = 50
for epoch in range(epochs):
    model.train()
    optimizer.zero_grad()
    outputs = model(X)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()
    if (epoch + 1) % 10 == 0:
        print(f"Epoch {epoch+1}/{epochs}, Loss: {loss.item():.4f}")

# 预测非线性残差
model.eval()
lstm_predictions = model(X).detach().numpy()
lstm_predictions = scaler.inverse_transform(lstm_predictions)

# 综合预测
combined_forecast = arima_forecast + lstm_predictions.flatten()

# 结果可视化
plt.figure(figsize=(12, 6))

# 图1:原始价格
plt.subplot(2, 2, 1)
plt.plot(data['Date'], data['Price'], label="Original Prices")
plt.title("Original Stock Prices")
plt.legend()

# 图2:ARIMA预测
plt.subplot(2, 2, 2)
plt.plot(data['Date'][train_size:], arima_forecast, label="ARIMA Forecast", color='orange')
plt.title("ARIMA Linear Prediction")
plt.legend()

# 图3:ARIMA残差与LSTM预测
plt.subplot(2, 2, 3)
plt.plot(data['Date'][train_size:], residuals, label="ARIMA Residuals", color='red')
plt.plot(data['Date'][train_size:][seq_length:], lstm_predictions, label="LSTM Residual Prediction", color='green')
plt.title("Residuals and LSTM Predictions")
plt.legend()

# 图4:综合预测
plt.subplot(2, 2, 4)
plt.plot(data['Date'][train_size:], test, label="Actual Prices")
plt.plot(data['Date'][train_size:], combined_forecast, label="Combined Forecast", color='purple')
plt.title("Combined ARIMA + LSTM Prediction")
plt.legend()

plt.tight_layout()
plt.show()

3. 数据分析图


原始股票价格趋势图:展示整体趋势,为后续建模提供参考。


ARIMA预测图:线性部分预测效果的展示。


残差分析图:显示非线性部分,并与LSTM预测进行对比。


综合预测效果图:展示ARIMA+LSTM模型的整体性能。



  优化与调参


1. 模型优化点


ARIMA参数选择:通过ACF和PACF确定最佳。


LSTM超参数优化


· 隐藏层单元数:影响记忆能力。


· 序列长度:需与数据的时间依赖特性匹配。


· 学习率与优化器:平衡收敛速度与稳定性。


混合策略调整:根据非线性程度调整ARIMA与LSTM的权重。


2. 调参流程


ARIMA调参:利用statsmodels自动选择。


LSTM调参:网格搜索或贝叶斯优化。


评估标准:RMSE、MAE等误差指标评估综合模型性能。


通过结合ARIMA与LSTM,实现了对时间序列线性与非线性特性的分离建模,提升了预测精度。表明混合模型在复杂时间序列预测中的优势。


 




文章改编转载自微信公众号:机器学习实战ML


原文链接:https://mp.weixin.qq.com/s/MSlNR6L7lY1qNm8UvlGYTw

8
0
0
0
关于作者
相关文章
  • 突破存储瓶颈——人工神经网络如何革新分子模拟数据的压缩与共享 ...
    随着计算能力的显著提升以及分子动力学模拟软件的不断进步,如何高效地存储和共享庞大的生物分子 ...
    了解详情 
  • 基于相干光量子计算机(CIM)的空时编码超表面量子启发优化算法复 ...
    本文是论文《 Quantum Annealing-Inspired Optimization for Space-TimeCoding Metasurface 》的 ...
    了解详情 
  • 解读2025诺贝尔物理学奖:三位学者证实宏观尺度量子隧穿,为量子 ...
    2025 年 10 月 7 日北京时间 17 时 45 分许,英国学者约翰·克拉克(John Clarke)、法国 ...
    了解详情 
  • ControlVAE:让虚拟角色 “学会” 多样动作技能的 AI 控制器 ...
    《 ControlVAE: Model-Based Learning of Generative Controllers for Physics-Based Characters ...
    了解详情 
联系我们
二维码
在本版发帖返回顶部
快速回复 返回顶部 返回列表
玻色有奖小调研
填写问卷,将免费赠送您5个100bit真机配额
(单选) 您是从哪个渠道得知我们的?*
您是从哪个社交媒体得知我们的?*
您是通过哪个学校的校园宣讲得知我们的呢?
取消

提交成功

真机配额已发放到您的账户,可前往【云平台】查看

量子AI开发者认证

考核目标

开发者能够成功搭建Kaiwu-PyTorch-Plugin项目基础环境,并成功运行QBM-VAE示例代码,根据系统提供的随机seed值,求出正确的FID值。

通过奖励

10个一年效期的550量子比特真机配额

专属「量子AI开发者」社区认证标识

开发者权益

每月固定权益:5个550量子比特真机配额
前往考核

第一步

按照README提示成功安装Kaiwu-PyTorch-Plugin库环境依赖
前往GitHub

第二步

替换seed值

您的seed值为

第三步

输入您计算的FID值

*

提交答案

开发者权益

每月固定权益:5个550量子比特的真机配额

恭喜您完成考核

您将获得量子AI开发者认证标识及考核奖励

550bit*10

配额