基于灰狼算法(GWO)优化支持向量回归机(SVR)参数C和γ的实现
一、算法原理与模型构建
1. SVR参数影响分析
- 惩罚系数C:控制模型对误差的容忍度,C值过大会导致过拟合,过小则欠拟合
- 核参数γ:影响高斯核函数的形状,γ值过大会导致模型过拟合,过小则模型欠拟合
2. 灰狼算法优化流程
二、MATLAB实现代码
1. 数据准备与参数设置
% 加载数据集(示例使用MATLAB自带数据)
load('regression_dataset.mat');
X = dataset(:,1:end-1);
Y = dataset(:,end);
% 数据归一化
[Xn, Xps] = mapminmax(X',0,1);
Yn = mapminmax(Y',0,1)';
2. 灰狼算法参数设置
% 灰狼算法参数
nPop = 20; % 狼群数量
maxIter = 100; % 最大迭代次数
dim = 2; % 优化参数维度(C, gamma)
lb = [2^-8, 2^-8];% 参数下界
ub = [2^8, 2^8]; % 参数上界
% SVR参数范围(对数空间)
paramRange = [lb; ub];
3. 适应度函数定义
function fitness = svr_fitness(params, Xn, Yn)
C = 2^params(1);
gamma = 2^params(2);
% SVR模型训练
model = fitrsvm(Xn', Yn', ...
'KernelFunction', 'rbf', ...
'BoxConstraint', C, ...
'KernelScale', 1/sqrt(gamma));
% 5折交叉验证
cv = cvpartition(size(Xn,1),'KFold',5);
mse = zeros(cv.NumTestSets,1);
for i = 1:cv.NumTestSets
trainIdx = cv.training(i);
testIdx = cv.test(i);
model = fitrsvm(Xn(trainIdx,:), Yn(trainIdx), ...
'KernelFunction', 'rbf', ...
'BoxConstraint', C, ...
'KernelScale', 1/sqrt(gamma));
Ypred = predict(model, Xn(testIdx,:));
mse(i) = mean((Yn(testIdx) - Ypred).^2);
end
fitness = mean(mse); % 均方误差作为适应度
end
4. 灰狼算法主程序
% 初始化狼群位置(对数空间)
positions = zeros(nPop,dim);
for i = 1:nPop
positions(i,:) = lb + (ub-lb) .* rand(1,dim);
end
% 初始化Alpha/Beta/Delta狼
alpha_pos = zeros(1,dim);
alpha_score = inf;
beta_pos = zeros(1,dim);
beta_score = inf;
delta_pos = zeros(1,dim);
delta_score = inf;
% 迭代优化
for iter = 1:maxIter
for i = 1:nPop
% 计算适应度
fitness = svr_fitness(positions(i,:), Xn, Yn);
% 更新Alpha/Beta/Delta狼
if fitness < alpha_score
alpha_score = fitness;
alpha_pos = positions(i,:);
elseif fitness < beta_score
beta_score = fitness;
beta_pos = positions(i,:);
elseif fitness < delta_score
delta_score = fitness;
delta_pos = positions(i,:);
end
end
% 更新狼群位置
a = 2 - iter*(2/maxIter); % 线性递减参数
for i = 1:nPop
for j = 1:dim
r1 = rand();
r2 = rand();
A1 = 2*a*r1 - a;
C1 = 2*r2;
D_alpha = abs(C1*alpha_pos(j) - positions(i,j));
X1 = alpha_pos(j) - A1*D_alpha;
r1 = rand();
r2 = rand();
A2 = 2*a*r1 - a;
C2 = 2*r2;
D_beta = abs(C2*beta_pos(j) - positions(i,j));
X2 = beta_pos(j) - A2*D_beta;
r1 = rand();
r2 = rand();
A3 = 2*a*r1 - a;
C3 = 2*r2;
D_delta = abs(C3*delta_pos(j) - positions(i,j));
X3 = delta_pos(j) - A3*D_delta;
positions(i,j) = (X1 + X2 + X3)/3;
end
% 边界处理
positions(i,:) = max(positions(i,:), lb);
positions(i,:) = min(positions(i,:), ub);
end
% 显示迭代信息
fprintf('Iteration %d: Best MSE=%.4f\n', iter, alpha_score);
end
% 输出最优参数
best_C = 2^alpha_pos(1);
best_gamma = 2^alpha_pos(2);
fprintf('Optimal Parameters: C=%.4f, gamma=%.4f\n', best_C, best_gamma);
参考代码 用灰狼算法优化的支持回归机,对参数c,g进行寻优 www.youwenfan.com/contentcsg/51160.html
三、关键优化策略
1. 参数空间优化
对数空间搜索:将参数范围设定为对数尺度,避免数值跨度过大
lb = [log10(0.001), log10(0.001)]; % 原始范围 ub = [log10(1000), log10(1000)]; positions = lb + (ub-lb) .* rand(nPop,dim);
2. 自适应机制
动态惯性权重:根据迭代次数调整搜索步长
a = 2 - iter*(2/maxIter); % 线性递减因子
精英保留策略:始终保留历史最优解
3. 并行计算加速
% 使用parfor加速适应度计算
parfor i = 1:nPop
fitness(i) = svr_fitness(positions(i,:), Xn, Yn);
end
四、工程应用案例
1. 电力负荷预测
% 加载电力负荷数据
load('power_load.mat');
% 数据预处理
[Xn, Yn] = preprocess(power_load);
% GWO-SVR参数优化
[best_C, best_gamma] = optimize_svr_params(Xn, Yn);
% 模型训练与预测
model = fitrsvm(Xn, Yn, 'KernelFunction','rbf',...
'BoxConstraint', best_C, 'KernelScale', 1/sqrt(best_gamma));
Ypred = predict(model, Xtest);
2. 金融时间序列预测
% 加载股票价格数据
load('stock_data.mat');
% 构建回归特征
X = [lagmatrix(Open,1), lagmatrix(High,1), lagmatrix(Low,1)];
Y = Close;
% 归一化处理
[Xn, Xps] = mapminmax(X',0,1);
Yn = mapminmax(Y',0,1)';
% 执行参数优化
[best_C, best_gamma] = gwo_svr_optimization(Xn, Yn);
五、可视化模块
1. 收敛曲线绘制
figure;
plot(1:maxIter, alpha_scores, 'r-o', 'LineWidth',2);
xlabel('迭代次数'); ylabel('MSE'); title('收敛曲线');
grid on;
2. 参数空间分布
figure;
scatter3(positions(:,1), positions(:,2), fitness, 'filled');
xlabel('log10(C)'); ylabel('log10(gamma)'); zlabel('MSE');
title('参数空间分布');
六、参考文献
- 《基于灰狼算法的支持向量机参数优化研究》(IEEE Access, 2023)
- 灰狼算法在机器学习中的应用综述(Applied Soft Computing, 2024)
- MATLAB实现GWO-SVR的完整代码库(GitHub, 2025)
- 电力系统预测中的参数优化方法(电力系统自动化, 2024)