轻松搞定!支持向量机SVM的参数自适应选择(附Matlab代码)

2023-12-28 12:14:18

引言

支持向量机SVM是机器学习中非常优秀的算法,在解决小样本问题上具有出色的性能。然而,SVM的性能受其参数的影响。传统的依靠人工经验选取和网格试错法都难以很好地解决。群智能优化算法是一种很有吸引力的算法,可以在保持计算成本合理的情况下解决SVM参数的选择问题,提高SVM的分类性能和泛化能力。本文利用matlab自带的SVM分类器(省去了安装第三方工具箱的繁琐),通过群智能优化算法选择SVM合适参数,解决分类问题。

数据集

本文使用分类任务中经典的iris鸢尾花数据集。该数据集有3个类别,每个类别50个样本,每个样本4个特征,形成了150*4的样本格式,即样本数*特征个数

SVM分类器

本文利用Matlab自带了SVM分类器fitcecoc函数用于多分类任务(类别数>2),利用fitcsvm用于二分类任务。详细信息请参考matlab的阅读文档:

https://www.mathworks.com/help/stats/fitcecoc.html??

本文选择径向基核函数(RBF)作为SVM的核函数,因此,SVM待选择的参数有两个:惩罚系数C和核参数g。k折交叉验证的误差作为优化目标函数。

优化算法

以2023年发表在中科院1区SCI上的成吉思汗鲨鱼优化算法(Genghis Khan shark optimizer,GKSO)(源码),和受欢迎的灰狼优化算法(GWO)(源码作为例子。前期也推出了多种统计指标(一网打尽优化算法的8种统计指标,助力提升论文录用率(附Matlab代码)),本文在SVM参数优化中继续使用。

% 这是一个入门级示例代码,目的是快速准确实现功能
% 更多高级的运用(图形美化,代码美化等),请自行探索修改
% 运行时间与电脑配置,参数设置等有关
% 关注微信公众号:优化算法侠,发现更多精彩
clc;clear;close all; warning off
disp('Running......')
%% 读取数据
load iris
data = iris(:,1:4); % 所有样本,格式:样本数N x 特征数M
labels=iris(:,5);   % 所有标签-用1,2,3...表示

%% 一些设置
global train_data train_label test_data test_label  %声明全局变量,便于后续使用

%  运行多次,结果保存在Optimal_results
str = {'中文名字','英文缩写','收敛曲线','最优函数值','最优解','输出标签','准确率'}; % 表头制作
Optimal_results={}; 
for i=1:length(str)
    Optimal_results{i,1}=str(i);
end
%% 每一次运行重新划分数据集
% 参数设置
run_times=2; % 运行次数
train_p=0.6; % 训练集比例:60%
% 优化问题的四大元素:
fobj=@objective_func;            % 目标函数
lb = [ 2^-3 2^-3];                % 下界
ub = [ 2^10 2^10 ];                 % 上界
dim=length(lb);                       % 维度
%
nPop=20;                                  % 种群数
MaxIter=30;                              % 最大迭代次数
for run_time=1:run_times
    %% 划分训练集和测试集

    [train_data, train_label,test_data,test_label]=data_splite(data,labels,train_p);
    
    %% 调用优化算法 
    % 
    tic
    [Best_score,Best_paras,cg_curve]=GWO(nPop,MaxIter,lb,ub,dim,fobj);
    [out_label,accuracy]= Make_model(Best_paras); % 输入测试集输出结果
    Optimal_results{1,2}="灰狼算法";                      % 中文名字
    Optimal_results{2,2}="GWO";                           % 名字
    Optimal_results{3,2}(run_time,:)=cg_curve;       % 收敛曲线
    Optimal_results{4,2}(run_time)=Best_score;      % 最优函数值
    Optimal_results{5,2}{run_time}=Best_paras;       % 最优解
    Optimal_results{6,2}{run_time}=out_label;         % 输出的标签
    Optimal_results{7,2}(run_time)=accuracy;         % 准确率
    
    % 
    [Best_score,Best_paras,cg_curve]=GKSO(nPop,MaxIter,lb,ub,dim,fobj);
    [out_label,accuracy]= Make_model(Best_paras); 
    Optimal_results{1,3}="成吉思汗鲨鱼算法";                     
    Optimal_results{2,3}="GKSO";                           
    Optimal_results{3,3}(run_time,:)=cg_curve;      
    Optimal_results{4,3}(run_time)=Best_score;      
    Optimal_results{5,3}{run_time}=Best_paras;      
    Optimal_results{6,3}{run_time}=out_label;         
    Optimal_results{7,3}(run_time)=accuracy;         
    %
    toc
end
%% 统计输出有:
%          最差值worst
%          最优值best
%          标准差值std 
%          均值mean 
%          中值median
%          wilcoxon_test:Wilcoxon符号秩检验、 Wilcoxon秩和检验
%          friedman_p_value:friedman检验
[Results,wilcoxon_test,friedman_p_value]=Cal_stats(Optimal_results);
for i=2:size(Results,2)    
    fprintf('%s 优化SVM的 %d 次平均准确率为:%.4f \n',Results{2,i},run_times,Results{7,i});
end
%% 绘图-收敛曲线,混淆矩阵,箱线图等
DrawPic(Results,Optimal_results)
disp('End !!!')

结果展示:

优化算法收敛曲线对比

图片

混淆矩阵

图片

图片

分类结果图

图片

图片

箱型图boxplot

图片

多次运行结果保存在Optimal_results中。这里考虑快速验证代码和算法,仅运行了2次,可根据实际需要修改。

图片

Matlab代码下载

微信搜索并关注-优化算法侠,或扫描下方二维码关注,以算法名字搜索历史文章即可下载。

纷传

320多种基础的群智能优化算法-matlab

速来下载!超320种基础优化算法!-Matlab版(截至2023.12.02)icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=MzkxMDQ5MDk4Ng==&mid=2247485602&idx=1&sn=806af7a9a7169b058e179ca2a089c287&chksm=c12be4a7f65c6db15c5969dd0223d2e42759a8e24a263fb71abac3b5015c0cabe2c5bdbbf285&token=649838004&lang=zh_CN#rd

175种群智能优化算法python库

超175+种群智能优化算法Python库!!!icon-default.png?t=N7T8http://mp.weixin.qq.com/s?__biz=MzkxMDQ5MDk4Ng==&mid=2247484577&idx=1&sn=ed0b2e27b73e738c094c7534a63a2cda&chksm=c12be8a4f65c61b2f3d90e2b4d1f480f8d0bb038b6598828ebf2434006e07925f8102af9795f&scene=21#wechat_redirect

求解cec测试函数-matlab

最新最火!cec2022测试函数来了(附Matlab代码)icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=MzkxMDQ5MDk4Ng==&mid=2247484693&idx=1&sn=ce311acb26bee2894db6fe90776288bd&chksm=c12be910f65c6006af080b1e97ad5514eee06b64d2caeeac2008b8c06fdc3ba379455e9ca709&scene=21#wechat_redirect

解决12工程设计优化问题-matlab

略微出手,工程设计问题(12)(附Matlab代码)icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=MzkxMDQ5MDk4Ng==&mid=2247485052&idx=1&sn=80e5573c1c005ee5640e44935044ee35&chksm=c12bea79f65c636fc73758b4f4893502bd89cbd1c5d15d7db15e8b5c94eeae40450439d44944&token=681266555&lang=zh_CN#rd

求解11种cec测试函数-python

一网打尽!170+种优化算法求解11种cec测试函数(附Python代码)icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=MzkxMDQ5MDk4Ng==&mid=2247484745&idx=1&sn=1957f7c9b44c47f171c1cd46054d1679&chksm=c12be94cf65c605a5e0f8404e6c90964ce0743b7c25ff5f98a03dedc77e5eec5b48bf0c0e782&token=681266555&lang=zh_CN#rd

解决12种工程设计优化问题-python

大放送!170+种优化算法解决12种工程设计问题(附python代码)icon-default.png?t=N7T8https://mp.weixin.qq.com/s?__biz=MzkxMDQ5MDk4Ng==&mid=2247485068&idx=1&sn=c913be0f2445f8b4d3e944569f5e599f&chksm=c12bea89f65c639f1df0f8e6cacffc1fdffa96683d10743094435ee6b0b55573a5bc8eec7eb3&token=681266555&lang=zh_CN#rd

文章来源:https://blog.csdn.net/weixin_44028734/article/details/135248233
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。