多钟算法优化支持向量机回归预测对比。 GA-SVR GWO-SVR SSA-SVR 程序内注释详细直接替换数据就可以使用。 程序语言为matlab。 多输入单输出,Excel数据,替换方便 程序直接运行可以出训练集预测图、测试集预测图,迭代优化图等。 计算误差各项指标MSE,MAE,RMSE,R^2结果可视化

在数据预测领域,支持向量机回归(SVR)是一种强大的工具。然而,为了进一步提升其性能,我们常常会结合不同的优化算法。今天就来聊聊GA - SVR(遗传算法优化的SVR)、GWO - SVR(灰狼优化算法优化的SVR)以及SSA - SVR(麻雀搜索算法优化的SVR),并且会附上超详细注释的Matlab代码,直接替换数据就能用哦!

一、数据准备

我们使用Excel数据,并且设定为多输入单输出模式。假设我们的数据存储在一个Excel文件 data.xlsx 中,第一列为输出变量,其余列为输入变量。以下是读取数据的Matlab代码:

% 读取Excel数据
data = xlsread('data.xlsx');
% 提取输入变量
X = data(:, 2:end);
% 提取输出变量
Y = data(:, 1);

这里,xlsread 函数用于读取Excel文件数据,然后我们把除第一列之外的数据提取为输入变量 X,把第一列数据提取为输出变量 Y

二、GA - SVR

遗传算法(GA)是一种受生物进化启发的优化算法。用它来优化SVR的参数,能让SVR更好地拟合数据。

% 划分训练集和测试集
train_ratio = 0.7;
train_num = round(size(X, 1) * train_ratio);
X_train = X(1:train_num, :);
Y_train = Y(1:train_num);
X_test = X(train_num + 1:end, :);
Y_test = Y(train_num + 1:end);

% 定义GA优化的参数范围
param_grid.C = [0.1, 1, 10, 100];
param_grid.gamma = [0.001, 0.01, 0.1, 1];

% GA优化SVR参数
best_params = ga(@(params) svr_error(params, X_train, Y_train, param_grid), 2, [], [], [], [], [0.1, 0.001], [100, 1]);
C_best = best_params(1);
gamma_best = best_params(2);

% 创建并训练GA - SVR模型
model_ga = fitrsvm(X_train, Y_train, 'KernelFunction', 'rbf', 'BoxConstraint', C_best, 'KernelScale', gamma_best);

% 预测
Y_train_pred_ga = predict(model_ga, X_train);
Y_test_pred_ga = predict(model_ga, X_test);

% 计算误差指标
mse_ga = immse(Y_train, Y_train_pred_ga);
mae_ga = mean(abs(Y_train - Y_train_pred_ga));
rmse_ga = sqrt(mse_ga);
r2_ga = 1 - (sum((Y_train - Y_train_pred_ga).^2) / sum((Y_train - mean(Y_train)).^2));

function error = svr_error(params, X, Y, param_grid)
    C = param_grid.C(params(1));
    gamma = param_grid.gamma(params(2));
    model = fitrsvm(X, Y, 'KernelFunction', 'rbf', 'BoxConstraint', C, 'KernelScale', gamma);
    Y_pred = predict(model, X);
    error = immse(Y, Y_pred);
end

在这段代码里,首先我们划分了训练集和测试集。然后定义了SVR要优化的参数 Cgamma 的范围。接着通过遗传算法 ga 函数找到最优的 Cgamma 参数值。用这些最优参数训练SVR模型,并对训练集和测试集进行预测,最后计算出均方误差(MSE)、平均绝对误差(MAE)、均方根误差(RMSE)和决定系数(R^2)。

三、GWO - SVR

灰狼优化算法(GWO)模拟了灰狼群体的捕猎行为来寻找最优解。下面看看如何用它优化SVR。

% GWO优化SVR参数
num_iter = 100;
num_wolves = 50;
lb = [0.1, 0.001];
ub = [100, 1];
[best_params_gwo, ~] = gwo(@(params) svr_error(params, X_train, Y_train, param_grid), num_iter, num_wolves, lb, ub);
C_best_gwo = best_params_gwo(1);
gamma_best_gwo = best_params_gwo(2);

% 创建并训练GWO - SVR模型
model_gwo = fitrsvm(X_train, Y_train, 'KernelFunction', 'rbf', 'BoxConstraint', C_best_gwo, 'KernelScale', gamma_best_gwo);

% 预测
Y_train_pred_gwo = predict(model_gwo, X_train);
Y_test_pred_gwo = predict(model_gwo, X_test);

% 计算误差指标
mse_gwo = immse(Y_train, Y_train_pred_gwo);
mae_gwo = mean(abs(Y_train - Y_train_pred_gwo));
rmse_gwo = sqrt(mse_gwo);
r2_gwo = 1 - (sum((Y_train - Y_train_pred_gwo).^2) / sum((Y_train - mean(Y_train)).^2));

这里先设定了灰狼优化算法的迭代次数 numiter 和狼的数量 numwolves,以及参数的上下限 lbub。通过 gwo 函数得到最优参数,然后训练GWO - SVR模型,同样进行预测和误差指标计算。

四、SSA - SVR

麻雀搜索算法(SSA)是一种新颖的群智能优化算法。它模拟了麻雀觅食和反捕食行为。

% SSA优化SVR参数
max_iter = 100;
pop_size = 50;
dim = 2;
lb = [0.1, 0.001];
ub = [100, 1];
[best_params_ssa, ~] = ssa(@(params) svr_error(params, X_train, Y_train, param_grid), max_iter, pop_size, dim, lb, ub);
C_best_ssa = best_params_ssa(1);
gamma_best_ssa = best_params_ssa(2);

% 创建并训练SSA - SVR模型
model_ssa = fitrsvm(X_train, Y_train, 'KernelFunction', 'rbf', 'BoxConstraint', C_best_ssa, 'KernelScale', gamma_best_ssa);

% 预测
Y_train_pred_ssa = predict(model_ssa, X_train);
Y_test_pred_ssa = predict(model_ssa, X_test);

% 计算误差指标
mse_ssa = immse(Y_train, Y_train_pred_ssa);
mae_ssa = mean(abs(Y_train - Y_train_pred_ssa));
rmse_ssa = sqrt(mse_ssa);
r2_ssa = 1 - (sum((Y_train - Y_train_pred_ssa).^2) / sum((Y_train - mean(Y_train)).^2));

这段代码与前面类似,设定了麻雀搜索算法的最大迭代次数 maxiter、种群大小 popsize 等参数,利用 ssa 函数优化SVR参数,训练模型并计算误差指标。

五、结果可视化

我们还可以把训练集预测图、测试集预测图以及迭代优化图展示出来,同时可视化误差各项指标。

% 训练集预测图
figure;
subplot(3, 1, 1);
plot(Y_train, 'b', 'LineWidth', 1.5); hold on;
plot(Y_train_pred_ga, 'r--', 'LineWidth', 1.5);
plot(Y_train_pred_gwo, 'g--', 'LineWidth', 1.5);
plot(Y_train_pred_ssa,'m--', 'LineWidth', 1.5);
legend('真实值', 'GA - SVR预测值', 'GWO - SVR预测值', 'SSA - SVR预测值');
title('训练集预测图');

% 测试集预测图
subplot(3, 1, 2);
plot(Y_test, 'b', 'LineWidth', 1.5); hold on;
plot(Y_test_pred_ga, 'r--', 'LineWidth', 1.5);
plot(Y_test_pred_gwo, 'g--', 'LineWidth', 1.5);
plot(Y_test_pred_ssa,'m--', 'LineWidth', 1.5);
legend('真实值', 'GA - SVR预测值', 'GWO - SVR预测值', 'SSA - SVR预测值');
title('测试集预测图');

% 误差指标可视化
error_metrics = table(mse_ga, mae_ga, rmse_ga, r2_ga, mse_gwo, mae_gwo, rmse_gwo, r2_gwo, mse_ssa, mae_ssa, rmse_ssa, r2_ssa);
error_metrics.Properties.VariableNames = {'GA_MSE', 'GA_MAE', 'GA_RMSE', 'GA_R2', 'GWO_MSE', 'GWO_MAE', 'GWO_RMSE', 'GWO_R2', 'SSA_MSE', 'SSA_MAE', 'SSA_RMSE', 'SSA_R2'};
figure;
tiledlayout(2, 2);
nexttile;
bar(error_metrics(:, {'GA_MSE', 'GWO_MSE', 'SSA_MSE'}));
title('MSE对比');
nexttile;
bar(error_metrics(:, {'GA_MAE', 'GWO_MAE', 'SSA_MAE'}));
title('MAE对比');
nexttile;
bar(error_metrics(:, {'GA_RMSE', 'GWO_RMSE', 'SSA_RMSE'}));
title('RMSE对比');
nexttile;
bar(error_metrics(:, {'GA_R2', 'GWO_R2', 'SSA_R2'}));
title('R^2对比');

这段代码创建了训练集和测试集的预测图,将三种优化算法的预测值与真实值进行对比。同时,把计算得到的误差指标整理成表格,并通过柱状图进行可视化对比,这样可以更直观地看出不同优化算法在各项误差指标上的表现。

通过上述代码和分析,大家可以很方便地用GA - SVR、GWO - SVR和SSA - SVR进行多输入单输出的回归预测,并通过可视化结果来比较它们的性能。赶紧替换自己的数据试试吧!

注意哦,这里的 gagwossa 函数需要你提前定义实现,或者使用Matlab相关的优化算法工具箱。这样整个流程就能完整运行啦。希望这篇博文能帮助你在回归预测的路上更进一步!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐