https://www.csie.ntu.edu.tw/~cjlin/libsvm/
找到Download,点击zip file,下载。
2 安装
将下载下来的libsvm放在自己电脑的MATLAB安装的toolbox文件夹下。
找到.mexdw文件所在目录,一般在libsvm-windows文件夹内,复制目录到matlab地址栏中
3 在matlab命令行输入以下几条语句测试安装
>> [heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
>> model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
*
optimization finished, #iter = 134
nu = 0.433785
obj = -101.855060, rho = 0.426412
nSV = 130, nBSV = 107
Total nSV = 130
>> [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label,heart_scale_inst, model);
Accuracy = 86.6667% (234/270) (classification)
最终出现这个Accuracy就说明安装成功了。
4 设置路径
在matlab工具栏中设置路径,添加libsvm下的windows文件夹,如图所示,要保证添加的libsvm路径在最上面。
如果你不设置这一步,当你用SVMcgForClass交叉验证时,matlab就会出现如下的错误:
错误使用 svmtrain (line 234) Y must be a vector or a character array.
这里解释一下SVMcgForClass的通过交叉验证来得到svmtrain函数中最优的c和g参数。
libsvm的参数详细解释参见帖子:
https://blog.csdn.net/zhaoluruoyan89/article/details/78342101
5 最后附一下用libsvm实现三分类的代码,包括SVMcgForClass交叉验证。
libsvm函数:
function predict_label=libsvm_3(train,train_group,test)
%train,train_group,test都为:行是样本数,列是特征数。
%数据预处理,用matlab自带的mapminmax将训练集和测试集归一化处理[0,1]之间
%训练数据处理
[train,pstrain] = mapminmax(train');
% 将映射函数的范围参数分别置为0和1
pstrain.ymin = 0;
pstrain.ymax = 1;
% 对训练集进行[0,1]归一化
[train,pstrain] = mapminmax(train,pstrain);
% 测试数据处理
[test,pstest] = mapminmax(test');
% 将映射函数的范围参数分别置为0和1
pstest.ymin = 0;
pstest.ymax = 1;
% 对测试集进行[0,1]归一化
[test,pstest] = mapminmax(test,pstest);
% 对训练集和测试集进行转置,以符合libsvm工具箱的数据格式要求
train = train';
test = test';
%寻找最优c和g
%粗略选择:c&g 的变化范围是 2^(-10),2^(-9),...,2^(10)
[bestacc,bestc,bestg] = SVMcgForClass(train_group,train,-10,10,-10,10,3,1,1,0.9);
%精细选择:c 的变化范围是 2^(-2),2^(-1.5),...,2^(4), g 的变化范围是 2^(-4),2^(-3.5),...,2^(4)
[bestacc,bestc,bestg] = SVMcgForClass(train_group,train,-2,4,-4,4,3,0.5,0.5,0.9);
%训练模型
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
model=svmtrain(train_group,train,cmd);
disp(cmd);
%测试分类
[m,~]=size(test);
test_group=zeros(m,1);
[predict_label, ~, ~]=svmpredict(test_group,test,model);
%当测试集没有预定结果的时候,也就是说,我们只是想用模型对一堆特征集分类而不是验证模型准确度时,将T置为任意值(但长度需要对应上特征集的大小)即可。
%这时打印predict_label就会显示分类器输出的分类结果。
%打印测试分类结果
figure;
hold on;
plot(test_group,'o');
plot(predict_label,'r*');
legend('实际测试集分类','预测测试集分类');
title('测试集的实际分类和预测分类图','FontSize',10);
SVMcgForClass交叉验证子函数:
function [bestacc,bestc,bestg] = SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
%SVMcg cross validation by faruto
%%
% by faruto
%Email:patrick.lee@foxmail.com QQ:516667408 http://blog.sina.com.cn/faruto BNU
%last modified 2010.01.17
%% 若转载请注明:
% faruto and liyang , LIBSVM-farutoUltimateVersion
% a toolbox with implements for support vector machines based on libsvm, 2009.
%
% Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for
% support vector machines, 2001. Software available at
% http://www.csie.ntu.edu.tw/~cjlin/libsvm
%% about the parameters of SVMcg
if nargin < 10
accstep = 4.5;
end
if nargin < 8
cstep = 0.8;
gstep = 0.8;
end
if nargin < 7
v = 5;
end
if nargin < 5
gmax = 8;
gmin = -8;
end
if nargin < 3
cmax = 8;
cmin = -8;
end
%% X:c Y:g cg:CVaccuracy
[X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);
[m,n] = size(X);
cg = zeros(m,n);
eps = 10^(-4);
%% record acc with different c & g,and find the bestacc with the smallest c
bestc = 1;
bestg = 0.1;
bestacc = 0;
basenum = 2;
for i = 1:m
for j = 1:n
cmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) )];
cg(i,j) = svmtrain(train_label, train, cmd);
if cg(i,j) <= 55
continue;
end
if cg(i,j) > bestacc
bestacc = cg(i,j);
bestc = basenum^X(i,j);
bestg = basenum^Y(i,j);
end
if abs( cg(i,j)-bestacc )<=eps && bestc > basenum^X(i,j)
bestacc = cg(i,j);
bestc = basenum^X(i,j);
bestg = basenum^Y(i,j);
end
end
end
%% to draw the acc with different c & g
figure;
[C,h] = contour(X,Y,cg,70:accstep:100);
clabel(C,h,'Color','r');
xlabel('log2c','FontSize',12);
ylabel('log2g','FontSize',12);
firstline = 'SVC参数选择结果图(等高线图)[GridSearchMethod]';
secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
' CVAccuracy=',num2str(bestacc),'%'];
title({firstline;secondline},'Fontsize',12);
grid on;
figure;
meshc(X,Y,cg);
% mesh(X,Y,cg);
% surf(X,Y,cg);
axis([cmin,cmax,gmin,gmax,30,100]);
xlabel('log2c','FontSize',12);
ylabel('log2g','FontSize',12);
zlabel('Accuracy(%)','FontSize',12);
firstline = 'SVC参数选择结果图(3D视图)[GridSearchMethod]';
secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...
' CVAccuracy=',num2str(bestacc),'%'];
title({firstline;secondline},'Fontsize',12);
最后说一句,如果你不想用SVMcgForClass交叉验证,那么-c,-g的参数就要自己调整了。