大家好,我是小青
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()