当前位置: 首页 > news >正文

当 LSTM 遇上 ARIMA!!

大家好,我是小青

ARIMA 和 LSTM 是两种常用于时间序列预测的模型,各有优劣。

ARIMA 擅长捕捉线性关系,而 LSTM 擅长处理非线性和长时间依赖的关系。将ARIMA 和 LSTM 融合,可以充分发挥它们各自的优势,构建更强大的时间序列预测模型。

ARIMA 算法

ARIMA 是一种经典的时间序列预测方法,适用于捕捉时间序列数据中的线性趋势和季节性模式。

它通过整合自回归 (AR)、差分 (I)、移动平均 (MA) 三部分,建模时间序列数据中的依赖关系。

以下是将 ARIMA 算法和 LSTM 算法进行融合,实现对时间序列预测的完整示例代码。

首先导入必要的库,并生成时间序列数据。

import numpy as np
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
import matplotlib.pyplot as plt# 生成模拟时间序列数据(正弦波 + 随机噪声)
np.random.seed(42)
time = np.arange(0, 100, 0.1)
data = np.sin(time) + 0.5 * np.random.normal(size=len(time))# 数据分割
train_size = int(len(data) * 0.8)
train_data, test_data = data[:train_size], data[train_size:]# 可视化数据
plt.plot(data, label='Original Data')
plt.axvline(train_size, color='red', linestyle='--', label='Train/Test Split')
plt.legend()
plt.show()

图片

接下来,使用 ARIMA 算法捕捉时间序列数据中的线性成分。

# 使用 ARIMA 模型拟合训练数据
arima_model = ARIMA(train_data, order=(5, 1, 0))  # 设置 p, d, q 参数
arima_result = arima_model.fit()# 生成 ARIMA 的预测值
arima_pred_train = arima_result.predict(start=1, end=len(train_data)-1)
arima_residuals = train_data[1:] - arima_pred_train  # 提取残差

然后,使用 LSTM 捕捉非线性残差。

# 数据归一化
scaler = MinMaxScaler(feature_range=(0, 1))
arima_residuals_scaled = scaler.fit_transform(arima_residuals.reshape(-1, 1))# 构建 LSTM 的输入特征
def create_lstm_dataset(data, time_steps=10):X, y = [], []for i in range(len(data) - time_steps):X.append(data[i:i+time_steps])y.append(data[i+time_steps])return np.array(X), np.array(y)time_steps = 10
X_train, y_train = create_lstm_dataset(arima_residuals_scaled, time_steps)# 定义 LSTM 模型
lstm_model = Sequential([LSTM(50, activation='relu', input_shape=(time_steps, 1)),Dense(1)
])# 编译 LSTM 模型
lstm_model.compile(optimizer='adam', loss='mse')# 训练 LSTM 模型
lstm_model.fit(X_train, y_train, epochs=20, batch_size=32, verbose=1)

融合预测

# 使用 ARIMA 对测试数据预测
arima_pred_test = arima_result.predict(start=len(train_data), end=len(data)-1)# 准备 LSTM 的输入
test_residuals = test_data - arima_pred_test
test_residuals_scaled = scaler.transform(test_residuals.reshape(-1, 1))X_test, _ = create_lstm_dataset(test_residuals_scaled, time_steps)# 使用 LSTM 对残差进行预测
lstm_pred = lstm_model.predict(X_test)
lstm_pred = scaler.inverse_transform(lstm_pred)# 融合预测结果
final_pred = arima_pred_test[time_steps:] + lstm_pred.flatten()# 可视化预测结果
plt.plot(test_data[time_steps:], label='True Values')
plt.plot(final_pred, label='ARIMA + LSTM Prediction')
plt.legend()
plt.show()

图片

http://www.lryc.cn/news/536228.html

相关文章:

  • kali连接xshell
  • 图像曲率滤波
  • TCP 和 UDP 可以绑定相同的端口吗?
  • 【Python网络爬虫】爬取网站图片实战
  • 2024年博客之星年度评选—创作影响力评审+主题文章创作评审目前排名(2024博客之星陪跑小分队助力2024博客之星创作者成长)
  • 【CLIP系列】4:目标检测(ViLD、GLIP)
  • Qt Designer菜鸟使用教程(实现一个本地英文翻译软件)
  • 【一文读懂】HTTP与Websocket协议
  • 大语言模型入门
  • SQL 大厂面试题目(由浅入深)
  • Shader Step和frac函数
  • FreeRtos实时系统: 十二.FreeRTOS的队列集
  • NLP Word Embeddings
  • 如何在24GB的GPU上运行DeepSeek-R1-Distill-Qwen-32B
  • 2025年二级建造师报名流程图解
  • 深入浅出:Python 中的异步编程与协程
  • 八大排序——简单选择排序
  • vue使用CSS布局技术,实现div定位到页面底部或顶部并居中功能
  • Jenkins 部署 之 Mac 一
  • 【FastAPI 使用FastAPI和uvicorn来同时运行HTTP和HTTPS的Python应用程序】
  • HCIA-路由器相关知识和面试问题
  • Docker+Jenkins自动化部署SpringBoot项目【详解git,jdk,maven,ssh配置等各种配置,附有示例+代码】
  • PCL 点云数学形态学操作(腐蚀)
  • 【设计模式】【行为型模式】观察者模式(Observer)
  • RAGFlow和Dify对比
  • AI前端开发:蓬勃发展的机遇与挑战
  • 结构型模式---代理模式
  • Java面向对象一:相关概念
  • CEF132 编译指南 MacOS 篇 - depot_tools 安装与配置 (四)
  • React VS Vue