如何使用SCSSA-CNN-BiLSTM时间序列预测模型。这个模型结合了改进的麻雀搜索算法(SCSSA)来优化卷积神经网络(CNN)和长短期记忆网络(BiLSTM)的时间序列预测模型。
声明:博客所有代码仅供参考!
SCSSA-CNN-BiLSTM时间序列预测
柯西变异和正余弦改进的麻雀搜索算法(SCSSA)优化卷积-长短期记忆神经网络的数据预测模型 Matlab语言
1.Matlab版本要在2020B以上。
优化的参数为:学习率,隐藏层节点数 ,正则化参数。
评价指标包括:R2、MAE、RMSE和MAPE等,图很多,出图结果如图所示,可完全满足您的需求
2.SCSSA优化算法是基于麻雀优化算法改进,融合了柯西变异和正余弦。
3.测试数据,可直接运行
如何使用SCSSA-CNN-BiLSTM时间序列预测模型。这个模型结合了改进的麻雀搜索算法(SCSSA)来优化卷积神经网络(CNN)和长短期记忆网络(BiLSTM)的时间序列预测模型。以下是详细的步骤和代码示例。
步骤概述
- 安装Matlab
- 准备数据集
- 实现SCSSA优化算法
- 构建CNN-BiLSTM模型
- 训练模型
- 评估模型
1. 安装Matlab
确保你已经安装了Matlab 2020B或更高版本。如果没有安装,请从MathWorks官方网站下载并安装。
2. 准备数据集
假设你有一个时间序列数据集,并且已经将其分为训练集和测试集。为了演示目的,我们将生成一些示例数据。
% 生成示例时间序列数据
Fs = 1; % 采样频率
T = 1/Fs; % 采样周期
L = 1000; % 数据长度
t = (0:L-1)*T; % 时间向量
% 生成示例数据
data = sin(0.05*t) + 0.5*sin(0.1*t) + randn(size(t))*0.1;
% 划分训练集和测试集
train_size = round(0.8 * L);
X_train = data(1:train_size);
X_test = data(train_size+1:end);
% 归一化数据
mu = mean(X_train);
sigma = std(X_train);
X_train_normalized = (X_train - mu) / sigma;
X_test_normalized = (X_test - mu) / sigma;
3. 实现SCSSA优化算法
实现基于柯西变异和正余弦改进的麻雀搜索算法(SCSSA)。
function [best_params, best_fitness] = scssa(num_vars, lb, ub, max_iter, train_data)
% 参数初始化
population_size = 30;
position = zeros(population_size, num_vars);
fitness = inf(population_size, 1);
% 初始化位置
for i = 1:population_size
position(i, :) = lb + (ub - lb) .* rand(1, num_vars);
end
% 计算初始适应度
for i = 1:population_size
fitness(i) = objective_function(position(i, :), train_data);
end
% 最优解
[~, idx] = min(fitness);
best_position = position(idx, :);
best_fitness = fitness(idx);
% 主循环
for iter = 1:max_iter
% 更新位置
for i = 1:population_size
if rand < 0.5
% 柯西变异
r1 = rand;
r2 = rand;
step_size = r1 .* tan(pi .* r2 ./ 2) .* (position(i, :) - best_position);
new_position = position(i, :) + step_size;
else
% 正余弦变异
r1 = rand;
r2 = rand;
alpha = pi .* r1;
beta = 2 .* pi .* r2;
step_size = cos(alpha) .* sin(beta) .* (position(i, :) - best_position);
new_position = position(i, :) + step_size;
end
% 边界处理
new_position = max(min(new_position, ub), lb);
% 计算新适应度
new_fitness = objective_function(new_position, train_data);
% 更新位置和适应度
if new_fitness < fitness(i)
position(i, :) = new_position;
fitness(i) = new_fitness;
% 更新最优解
if new_fitness < best_fitness
best_position = new_position;
best_fitness = new_fitness;
end
end
end
% 显示进度
fprintf('Iteration %d: Best Fitness = %.4f\n', iter, best_fitness);
end
best_params = best_position;
end
function fitness = objective_function(params, train_data)
% 解包参数
learning_rate = params(1);
hidden_nodes = round(params(2));
regularization_param = params(3);
% 构建CNN-BiLSTM模型
layers = [
sequenceInputLayer(1)
convolution2dLayer(filterSize=3,numFilters=hidden_nodes,Padding='same')
reluLayer
fullyConnectedLayer(hidden_nodes)
reluLayer
bilstmLayer(hidden_nodes,'OutputMode','sequence')
fullyConnectedLayer(1)
regressionLayer];
options = trainingOptions('adam', ...
'MaxEpochs', 100, ...
'InitialLearnRate', learning_rate, ...
'GradientThreshold', 1, ...
'Regularization', 'l2', ...
'L2RegularizationFactor', regularization_param, ...
'Plots', 'training-progress');
% 训练模型
net = trainNetwork(train_data(:, 1:end-1)', train_data(:, end)', layers, options);
% 预测
X_pred = predict(net, train_data(:, 1:end-1)');
Y_true = train_data(:, end)';
% 计算评价指标
R2 = rsquare(Y_true, X_pred(:));
MAE = mean(abs(Y_true - X_pred(:)));
RMSE = sqrt(mean((Y_true - X_pred(:)).^2));
MAPE = mean(abs((Y_true - X_pred(:)) ./ Y_true)) * 100;
% 综合评价指标
fitness = -(R2 - MAE - RMSE - MAPE); % 负号表示最大化目标函数
end
4. 构建CNN-BiLSTM模型
在objective_function
中已经包含了CNN-BiLSTM模型的构建和训练。
5. 训练模型
编写主脚本来调用SCSSA优化算法并训练模型。
[<title="SCSSA-CNN-BiLSTM Time Series Prediction">]
% 参数设置
num_vars = 3; % 学习率, 隐藏层节点数, 正则化参数
lb = [0.0001, 10, 0.001]; % 下边界
ub = [0.1, 100, 0.1]; % 上边界
max_iter = 50; % 迭代次数
% 准备训练数据
seq_length = 20; % 序列长度
[train_data, test_data] = prepare_sequence_data(X_train_normalized, seq_length);
% SCSSA优化
[best_params, best_fitness] = scssa(num_vars, lb, ub, max_iter, train_data);
% 解包最佳参数
learning_rate = best_params(1);
hidden_nodes = round(best_params(2));
regularization_param = best_params(3);
% 构建CNN-BiLSTM模型
layers = [
sequenceInputLayer(seq_length)
convolution2dLayer(filterSize=3,numFilters=hidden_nodes,Padding='same')
reluLayer
fullyConnectedLayer(hidden_nodes)
reluLayer
bilstmLayer(hidden_nodes,'OutputMode','sequence')
fullyConnectedLayer(1)
regressionLayer];
options = trainingOptions('adam', ...
'MaxEpochs', 100, ...
'InitialLearnRate', learning_rate, ...
'GradientThreshold', 1, ...
'Regularization', 'l2', ...
'L2RegularizationFactor', regularization_param, ...
'Plots', 'training-progress');
% 训练模型
net = trainNetwork(train_data(:, 1:end-1)', train_data(:, end)', layers, options);
% 预测
X_pred_train = predict(net, train_data(:, 1:end-1)');
Y_true_train = train_data(:, end)';
X_pred_test = predict(net, test_data(:, 1:end-1)');
Y_true_test = test_data(:, end)';
% 反归一化
X_pred_train = X_pred_train * sigma + mu;
Y_true_train = Y_true_train * sigma + mu;
X_pred_test = X_pred_test * sigma + mu;
Y_true_test = Y_true_test * sigma + mu;
% 计算评价指标
[R2_train, MAE_train, RMSE_train, MAPE_train] = calculate_metrics(Y_true_train, X_pred_train);
[R2_test, MAE_test, RMSE_test, MAPE_test] = calculate_metrics(Y_true_test, X_pred_test);
% 打印评价指标
fprintf('Training Metrics:\n');
fprintf('R2: %.4f, MAE: %.4f, RMSE: %.4f, MAPE: %.4f%%\n', R2_train, MAE_train, RMSE_train, MAPE_train);
fprintf('Test Metrics:\n');
fprintf('R2: %.4f, MAE: %.4f, RMSE: %.4f, MAPE: %.4f%%\n', R2_test, MAE_test, RMSE_test, MAPE_test);
% 可视化结果
figure;
subplot(2, 1, 1);
plot(t(1:length(Y_true_train)), Y_true_train, 'b', 'DisplayName', 'True Train Data');
hold on;
plot(t(1:length(Y_true_train)), X_pred_train, 'r--', 'DisplayName', 'Predicted Train Data');
legend;
title('Train Data Prediction');
xlabel('Time');
ylabel('Value');
subplot(2, 1, 2);
plot(t(length(Y_true_train)+1:end), Y_true_test, 'g', 'DisplayName', 'True Test Data');
hold on;
plot(t(length(Y_true_train)+1:end), X_pred_test, 'm--', 'DisplayName', 'Predicted Test Data');
legend;
title('Test Data Prediction');
xlabel('Time');
ylabel('Value');
function [train_data, test_data] = prepare_sequence_data(data, seq_length)
num_samples = length(data) - seq_length;
train_data = zeros(num_samples, seq_length + 1);
test_data = zeros(num_samples, seq_length + 1);
split_index = round(0.8 * num_samples);
for i = 1:num_samples
if i <= split_index
train_data(i, :) = data(i:i+seq_length)';
else
test_data(i-split_index, :) = data(i:i+seq_length)';
end
end
end
function [R2, MAE, RMSE, MAPE] = calculate_metrics(Y_true, Y_pred)
R2 = rsquare(Y_true, Y_pred);
MAE = mean(abs(Y_true - Y_pred));
RMSE = sqrt(mean((Y_true - Y_pred).^2));
MAPE = mean(abs((Y_true - Y_pred) ./ Y_true)) * 100;
end
解释
- 参数设置:定义优化算法的参数范围和迭代次数。
- 准备训练数据:将时间序列数据转换为适合CNN-BiLSTM输入的格式。
- SCSSA优化:调用SCSSA优化算法找到最佳参数。
- 构建CNN-BiLSTM模型:根据最佳参数构建CNN-BiLSTM模型。
- 训练模型:使用最佳参数训练CNN-BiLSTM模型。
- 预测:在训练集和测试集上进行预测。
- 反归一化:将预测结果反归一化。
- 计算评价指标:计算R²、MAE、RMSE和MAPE等评价指标。
- 可视化结果:绘制训练集和测试集的真实值与预测值对比图。
运行脚本
保存上述脚本到一个Matlab文件中,例如train_scssa_cnn_bilstm.m
,然后运行该脚本:
run('train_scssa_cnn_bilstm.m')