1.下载工具包libsvm-3.2.3
2.解压到MATLAB toolbox的路径,并在MATLAB设置路径->添加并包含子文件夹..
3.在MATLAB程序的当前文件夹打开这个文件夹的matlab文件夹(路径如下:D:\matlab\2018a\toolbox\libsvm-3.2.3\matlab)
4.命令行里面敲:>>mex -setup 回车键
我的电脑是WIN10,MATLAB是2018a,装了一个VS2012,这些软件可以关注:软件安装管家 这个公众号,软件目录->软件目录->里面可以找到自己需要的软件,百度云下载,有详细教程(不是打广告,就是这个很好用,安利一下~)
5.我的操作过程大概是这样,其中需要注意的两点:mex后面带一个空格,在setup之后要选择其中一种命令才能继续(我没选直接make的时候只有两个文件编译成功,想了很久的原因)
6.如图所示,make编译成功了4个文件,分别是libsvmread.mexw64,libsvmwrite.mexw64,svmpredict.mexw64,svmtrain.mexw64.
把这4个文件都复制到D:\matlab\2018a\toolbox\libsvm-3.2.3\windows.
7.具体使用这个工具箱做训练的时候,(我的项目是特征和它对应的分数)对数据做的预处理是把训练和测试的特征映射到[-1,1],对于分数没有进行处理
[pn_train,inputps] = mapminmax(pn_train'); %训练的特征做的预处理。
pn_test = mapminmax('apply',pn_test',inputps); %测试的特征做的预处理。
8.运行一段选择最优参数的代码;
% 1. 寻找最佳c参数/g参数
[c,g] = meshgrid(-10:1:10,-10:1:10); %我在这里对步长做出了改变,原来是0.5,训练要用的时间实在太久了
[m,n] = size(c);
cg = zeros(m,n);
eps = 10^(-4);
v = 5;
bestc = 0;
bestg = 0;
error = Inf;
for i = 1:m
for j = 1:n
cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j) ),' -s 3 -p 0.1'];
cg(i,j) = svmtrain(tn_train, pn_train, cmd); %tn_train 是我的训练集的分数
if cg(i,j) < error
error = cg(i,j);
bestc = 2^c(i,j);
bestg = 2^g(i,j);
end
if abs(cg(i,j) - error) <= eps && bestc > 2^c(i,j)
error = cg(i,j);
bestc = 2^c(i,j);
bestg = 2^g(i,j);
end
end
end
9.模型的训练
cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -p 0.01'];
model = svmtrain(tn_train, pn_train, cmd); %这些程序就是套路,要注意的是矩阵的维度
10.分数的预测
[Predict] = svmpredict(tn_test,pn_test,model); %输入的应该是样本数*特征数/分数
11.得到整体的预测,做完数据分析以后,还要对输入的某一个样本进行预测
问题是在这里开始出现的,我发现不管怎么改变我的输入样本,得到的分数都是一样的值,我搜了一下好多同学遇到了和我一样的问题,没找到解决方案。后来,因为我也做了另一种SR方法的预测,对比了两者之间的不同,SR方法做训练的时候对测试图像进行一一预测,并把结果顺序存起来;而SVR是把所有的数据都输入进去,然后给出所有的预测分数(相当于一个黑盒子)。根据这个思路,我的解决方法是,把要测试的图像的特征整理到一起,样本数*特征数的矩阵,再对它进行数据预处理。
[score] = svmpredict(tn_test,pn_test,model); % 跟上面一样,tn_test是预测样本的分数,根据工具包中readme,未知的时候可以给他一个随机的数,我使用的函数是:rand.
抖个小机灵,要是能解决一点你的问题,记得夸夸我呀~
侵删~