MATLAB实现LIBSVM中的c和g的参数寻优

编程入门 行业动态 更新时间:2024-10-24 18:19:48

MATLAB实现LIBSVM中的c和g的<a href=https://www.elefans.com/category/jswz/34/1771441.html style=参数寻优"/>

MATLAB实现LIBSVM中的c和g的参数寻优

引言:LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。

我们在进行科学研究的时候会经常使用SVM对数据进行分类,MATLAB自带的SVM函数调参麻烦,且只支持分类问题,不支持回归问题。因此,林教授开发的功能更为强大的LIBSVM就是我们的不二选择。

LIBSVM支持MATLAB、Python、C等编译语言,今天我将讲解的是在MATLAB环境下调用LIBSVM。

其中:LIBSVM工具包下载:/,具体安装过程这里就不详细介绍了,大家可以参考其他博客。

一:LIBSVM的使用

模型训练:model = svmtrain(label,data,'libsvm_options');

模型预测:[predicted_label,accuary] = svmpredict(label_test,data_test,model,'libsvm_options')

其中libsvm_options为可选参数,其具体内容如下:

-s 设置svm类型:0 – C-SVC1 – v-SVC2 – one-class-SVM3 – ε-SVR4 – n – SVR-t 设置核函数类型, 默认值为20 — 线性核: μ‘∗ν1 — 多项式核:    (γ∗μ‘∗ν+coef0)degree2 — RBF核: exp(–γ∗∥μ−ν∥2)3 — sigmoid 核: tanh(γ∗μ‘∗ν+coef0)-d degree: 核函数中的degree设置(针对多项式核函数)(默认3);-g r(gama): 核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k);-r coef0: 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0);-c cost: 设置C-SVC, e -SVR和v-SVR的参数(损失函数)(默认1);-n nu: 设置v-SVC, 一类SVM和v- SVR的参数(默认0.5);-p p: 设置e -SVR 中损失函数p的值(默认0.1);-m cachesize: 设置cache内存大小, 以MB为单位(默认40);-e eps: 设置允许的终止判据(默认0.001);-h shrinking: 是否使用启发式, 0或1(默认1);-wi weight: 设置第几类的参数C为weight*C (C-SVC中的C) (默认1);-v n: n-fold交互检验模式, n为fold的个数, 必须大于等于2;-b 概率估计: 是否计算SVC或SVR的概率估计, 可选值0或1, 默认0;

例:

分类问题:

model = svmtrain(label_train,data_train,'-s 0 -t 2 -c 0.1 -g 0.1');

[predicted_label,accuray] = svmpredict(label_test,data_test,model)

回归问题:

model = svmtrain(label_train,data_train,'-s 3 -t 2-c 0.1 -g 0.1 -p 0.01')

predicted_label = svmpredict(label_test,data_test,model)

二:c、g参数寻优问题

针对SVM中的参数优化,Python环境下的LIBSVM中有寻优函数grid.py帮助大家寻找最优的c和g:

但是MATLAB环境下的LIBSVM却没有这个功能,因此今天这里就给大家分享在MATLAB环境下实现LIBSVM参数c和g的自动寻优:

function [best_c,best_g,best_acc] = SvmSearchParas(data,label,c_max,c_min,c_step,g_max,g_min,g_step,v)
%--------------------------------------------------------------------------
%The function looks for the SVM's most important parameters c and g
%The Author:等等登登-Ande
%The Email:18356768364@163
%The Blog:qq_35166974
%%
%Initialization parameter
if nargin < 9v = 10;
end
if nargin < 8v = 10;g_step = 1;
end
if nargin < 7v = 10;g_step = 1;c_step = 1;
end
if nargin < 6v = 10;g_step = 1;c_step = 1;g_min = -5;
end
if nargin < 5v = 10;g_step = 1;c_step = 1;g_min = -5;g_max = 5;
end
if nargin < 4v = 10;g_step = 1;c_step = 1;g_min = -5;g_max = 5;c_min = -5;
end
if nargin < 3v = 10;g_step = 1;c_step = 1;g_min = -5;g_max = 5;c_min = -5;c_max = 5;
end
if nargin < 2warning('You did not enter enough parameters!');
end
%%
%Parameter optimization
[mesh1,mesh2] = meshgrid(c_min:c_step:c_max,g_min:g_step:g_max);
[raw,col] = size(mesh1);
acc = zeros(raw,col);
for i=1:rawfor j=1:colcg_paras = ['-v ',num2str(v),'-c ',num2str(2.^mesh1(i,j)),' ','-g ',num2str(2.^mesh2(i,j))];acc(i,j) = libsvmtrain(double(label),double(data),cg_paras);end
end
best_acc = max(max(acc));
[label_i,label_j] = find(acc==best_acc);
best_c = 2.^mesh1(label_i,label_j);
best_g = 2.^mesh2(label_i,label_j);
figure
mesh(mesh1,mesh2,acc);
xlabel('log2c');
ylabel('log2g');
zlabel('Accuracy')

 

 

 

 

 

 

更多推荐

MATLAB实现LIBSVM中的c和g的参数寻优

本文发布于:2024-03-05 04:44:01,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1711344.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:参数   MATLAB   LIBSVM

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!