%% 基于BiLSTM-Bayes-SVM的多变量回归预测
% 多输入单输出 | Matlab实现
% 步骤:数据准备 -> BiLSTM特征提取 -> SVM回归 -> 贝叶斯优化
%% 1. 数据准备
clear; clc;
% 加载示例数据(替换为实际数据)
load('mgdata.mat'); % 示例数据,替换为你的数据集
data = mgdata';
% 参数设置
inputSize = size(data, 1) - 1; % 输入变量数量
outputSize = 1; % 输出变量数量
windowSize = 10; % 时间窗口大小
trainRatio = 0.8; % 训练集比例
% 创建时间序列数据
[X, Y] = createTimeSeriesData(data, windowSize, inputSize, outputSize);
% 划分训练集和测试集
numSamples = size(X, 1);
numTrain = floor(trainRatio * numSamples);
XTrain = X(1:numTrain, :);
YTrain = Y(1:numTrain);
XTest = X(numTrain+1:end, :);
YTest = Y(numTrain+1:end);
% 重塑数据为LSTM需要的格式 [样本数, 时间步, 特征数]
XTrain = reshape(XTrain, [size(XTrain,1), windowSize, inputSize]);
XTest = reshape(XTest, [size(XTest,1), windowSize, inputSize]);
%% 2. 构建BiLSTM特征提取器
% 定义BiLSTM网络结构
layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(128, 'OutputMode', 'last')
fullyConnectedLayer(64)
reluLayer()
fullyConnectedLayer(32)
dropoutLayer(0.2)
fullyConnectedLayer(outputSize)
regressionLayer];
% 训练选项
options = trainingOptions('adam', ...
'MaxEpochs', 100, ...
'MiniBatchSize', 32, ...
'InitialLearnRate', 0.001, ...
'LearnRateDropPeriod', 20, ...
'LearnRateDropFactor', 0.7, ...
'Shuffle', 'every-epoch', ...
'Verbose', 1, ...
'Plots', 'training-progress');
% 训练BiLSTM网络
net = trainNetwork(XTrain, YTrain, layers, options);
% 提取BiLSTM特征(使用最后一个全连接层之前的层)
featureExtractor = layerGraph(net.Layers);
featureExtractor = removeLayers(featureExtractor, {'regressionoutput'});
featureLayerName = 'fc_3'; % 根据实际层名调整
% 提取训练集特征
featuresTrain = activations(net, XTrain, featureLayerName, 'OutputAs', 'rows');
% 提取测试集特征
featuresTest = activations(net, XTest, featureLayerName, 'OutputAs', 'rows');
%% 3. 贝叶斯优化SVM超参数
% 定义优化目标函数
objFcn = @(params)svmRegressionLoss(featuresTrain, YTrain, ...
params.BoxConstraint, params.KernelScale, params.Epsilon);
% 定义超参数搜索空间
optimVars = [
optimizableVariable('BoxConstraint', [0.001, 1000], 'Transform', 'log')
optimizableVariable('KernelScale', [0.001, 1000], 'Transform', 'log')
optimizableVariable('Epsilon', [0.001, 1], 'Transform', 'log')
];
% 运行贝叶斯优化
results = bayesopt(objFcn, optimVars, ...
'MaxObjectiveEvaluations', 30, ...
'IsObjectiveDeterministic', false, ...
'UseParallel', false);
% 获取最佳超参数
bestParams = results.bestPoint;
%% 4. 训练SVM回归模型
svmModel = fitrsvm(featuresTrain, YTrain, ...
'KernelFunction', 'gaussian', ...
'BoxConstraint', bestParams.BoxConstraint, ...
'KernelScale', bestParams.KernelScale, ...
'Epsilon', bestParams.Epsilon, ...
'Standardize', true);
%% 5. 预测与评估
% 预测测试集
YPred = predict(svmModel, featuresTest);
% 计算性能指标
mse = mean((YTest - YPred).^2);
rmse = sqrt(mse);
mae = mean(abs(YTest - YPred));
r2 = 1 - sum((YTest - YPred).^2) / sum((YTest - mean(YTest)).^2);
% 显示结果
fprintf('测试集性能指标:\n');
fprintf('MSE: %.4f\n', mse);
fprintf('RMSE: %.4f\n', rmse);
fprintf('MAE: %.4f\n', mae);
fprintf('R²: %.4f\n', r2);
% 绘制结果
figure;
plot(YTest, 'b', 'LineWidth', 1.5);
hold on;
plot(YPred, 'r--', 'LineWidth', 1.5);
legend('实际值', '预测值');
title('BiLSTM-Bayes-SVM预测结果');
xlabel('样本');
ylabel('目标值');
grid on;
%% 辅助函数:创建时间序列数据
function [X, Y] = createTimeSeriesData(data, windowSize, inputSize, outputSize)
numSteps = size(data, 2) - windowSize;
X = zeros(numSteps, windowSize * inputSize);
Y = zeros(numSteps, outputSize);
for i = 1:numSteps
X(i, :) = reshape(data(1:inputSize, i:i+windowSize-1), 1, []);
Y(i, :) = data(inputSize+1, i+windowSize);
end
end
%% 辅助函数:SVM回归损失计算
function loss = svmRegressionLoss(X, Y, boxConstraint, kernelScale, epsilon)
% 交叉验证分区
cvp = cvpartition(size(X,1), 'KFold', 5);
cvLoss = zeros(cvp.NumTestSets, 1);
for i = 1:cvp.NumTestSets
trainIdx = cvp.training(i);
testIdx = cvp.test(i);
% 训练SVM模型
svmModel = fitrsvm(X(trainIdx,:), Y(trainIdx), ...
'KernelFunction', 'gaussian', ...
'BoxConstraint', boxConstraint, ...
'KernelScale', kernelScale, ...
'Epsilon', epsilon, ...
'Standardize', true);
% 预测验证集
YPred = predict(svmModel, X(testIdx,:));
% 计算均方误差
cvLoss(i) = mean((Y(testIdx) - YPred).^2);
end
% 平均交叉验证损失
loss = mean(cvLoss);
end
实现说明:
-
数据准备:
- 创建时间窗口数据
- 划分训练集和测试集
- 重塑数据为LSTM需要的格式
-
BiLSTM特征提取:
- 构建双向LSTM网络
- 训练网络进行初步预测
- 提取深层特征作为SVM输入
-
贝叶斯优化:
- 定义SVM超参数搜索空间
- 使用贝叶斯优化寻找最佳超参数组合
- 优化目标为5折交叉验证的均方误差
-
SVM回归:
- 使用优化后的超参数训练SVM模型
- 对测试集进行预测
-
性能评估:
- 计算MSE、RMSE、MAE和R²指标
- 可视化预测结果对比
关键参数说明:
- windowSize:时间窗口大小,决定使用多少历史时间步进行预测
- BiLSTM结构:128个隐藏单元的双向LSTM,后接全连接层
- 贝叶斯优化参数:BoxConstraint、KernelScale、Epsilon
- 评估指标:均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)、决定系数(R²)
使用指南:
- 准备数据:确保数据格式为[特征数×样本数]矩阵,最后一行为目标变量
- 调整参数:
- 根据数据规模调整windowSize
- 根据计算资源调整贝叶斯优化的MaxObjectiveEvaluations
- 可能需要调整BiLSTM层结构和大小
- 替换数据:将’mgdata.mat’替换为实际数据集
- 运行流程:依次执行数据准备→特征提取→贝叶斯优化→SVM训练→预测评估
此方案结合了深度学习和传统机器学习的优势,通过BiLSTM提取时间序列的高级特征,利用贝叶斯优化自动寻找SVM最佳超参数,适用于复杂时间序列预测任务。