在机器学习建模过程中,支持向量机(SVM)的参数选择直接影响模型性能。传统网格搜索方法耗时且容易陷入局部最优,而元启发式算法为解决这一问题提供了新思路。本文将详细介绍如何使用苍鹰优化算法(NGO)自动优化SVM的惩罚系数c和核函数参数g,实现高效的多输入单输出回归预测。
NGO算法模拟苍鹰捕猎行为,通过领导者-跟随者机制实现全局搜索与局部开发的平衡。相比PSO、GA等传统优化算法,NGO具有收敛速度快、参数少的特点。我们将其与SVM结合,构建完整的建模流程:
数据应以矩阵形式存储在Excel文件中,最后一列为输出变量。示例代码:
matlab复制data = xlsread('dataset.xlsx');
input = data(:,1:end-1); % 前n列作为输入特征
output = data(:,end); % 最后一列作为输出目标
注意:确保数据中不包含缺失值或非数值内容,否则会导致程序报错
为避免量纲差异对优化过程的影响,建议对输入数据进行归一化:
matlab复制[input_norm, input_ps] = mapminmax(input', 0, 1);
input_norm = input_norm';
output_norm = output; % 输出不参与归一化
归一化参数input_ps需要保存,用于后续新数据的相同处理。
采用随机抽样划分训练集(70%)和测试集(30%):
matlab复制n_samples = size(input,1);
idx = randperm(n_samples);
train_idx = idx(1:round(0.7*n_samples));
test_idx = idx(round(0.7*n_samples)+1:end);
input_train = input_norm(train_idx,:);
output_train = output_norm(train_idx);
input_test = input_norm(test_idx,:);
output_test = output_norm(test_idx);
NGO模拟苍鹰群体的捕猎行为,主要包含三个阶段:
算法通过领导者位置更新和跟随者位置更新实现上述行为。
matlab复制pop_size = 20; % 种群规模
max_iter = 100; % 最大迭代次数
dim = 2; % 优化变量维度(c和g)
lb = [0.1, 0.01]; % 参数下限
ub = [100, 10]; % 参数上限
matlab复制pop = lb + (ub-lb).*rand(pop_size,dim);
leader_pos = zeros(1,dim);
leader_fit = inf;
matlab复制for iter = 1:max_iter
% 更新领导者位置
[current_fit, idx] = min(fitness);
if current_fit < leader_fit
leader_fit = current_fit;
leader_pos = pop(idx,:);
end
% 更新跟随者位置
for i = 1:pop_size
r1 = rand();
r2 = rand();
beta = 1.5 - 1.0*iter/max_iter; % 自适应参数
if r1 > 0.6 % 开发阶段
new_pos = pop(i,:) + beta*(leader_pos - pop(i,:));
else % 探索阶段
new_pos = pop(i,:) + beta*randn(1,dim);
end
% 边界处理
new_pos = max(new_pos, lb);
new_pos = min(new_pos, ub);
pop(i,:) = new_pos;
end
% 记录最优解
convergence(iter) = leader_fit;
end
支持向量回归(SVR)通过寻找一个最优超平面,使所有样本点到该平面的距离最小。关键参数:
将SVM的交叉验证均方误差作为适应度值:
matlab复制function fitness = objfun(pop, input_train, output_train)
c = pop(1);
g = pop(2);
cmd = ['-s 3 -t 2 -c ', num2str(c), ' -g ', num2str(g), ' -p 0.01'];
model = svmtrain(output_train, input_train, cmd);
[~, mse, ~] = svmpredict(output_train, input_train, model);
fitness = mse(2); % 取均方误差
end
获取NGO优化后的最佳参数组合:
matlab复制best_c = leader_pos(1);
best_g = leader_pos(2);
cmd = ['-s 3 -t 2 -c ', num2str(best_c), ' -g ', num2str(best_g), ' -p 0.01'];
model = svmtrain(output_train, input_train, cmd);
matlab复制[predict_train, ~, ~] = svmpredict(output_train, input_train, model);
[predict_test, ~, ~] = svmpredict(output_test, input_test, model);
matlab复制% 训练集指标
train_error = output_train - predict_train;
train_mae = mean(abs(train_error));
train_rmse = sqrt(mean(train_error.^2));
train_r2 = 1 - (sum(train_error.^2)/sum((output_train - mean(output_train)).^2));
% 测试集指标
test_error = output_test - predict_test;
test_mae = mean(abs(test_error));
test_rmse = sqrt(mean(test_error.^2));
test_r2 = 1 - (sum(test_error.^2)/sum((output_test - mean(output_test)).^2));
matlab复制figure
plot(1:max_iter, convergence, 'LineWidth',2)
xlabel('迭代次数')
ylabel('适应度值(MSE)')
title('NGO优化过程')
grid on
matlab复制figure
plot(output_test,'b-o','LineWidth',2,'MarkerSize',5)
hold on
plot(predict_test,'r-s','LineWidth',2,'MarkerSize',5)
legend('实际值','预测值')
xlabel('样本编号')
ylabel('输出值')
title('测试集预测效果')
grid on
matlab复制figure
histogram(test_error,20)
xlabel('预测误差')
ylabel('频数')
title('误差分布直方图')
grid on
预测结果不理想
算法收敛速度慢
过拟合现象
项目主要包含以下文件:
main.m:主程序入口data_preprocess.m:数据预处理函数ngo.m:苍鹰优化算法实现svm_fitness.m:适应度函数计算plot_results.m:结果可视化函数提示:实际应用时,建议多次运行优化程序以避免随机性影响,取多次优化的平均结果作为最终参数