libsvm-3.2.3做训练并预测得分(主要讲一下我遇到的问题和解决方案)

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.   

抖个小机灵,要是能解决一点你的问题,记得夸夸我呀~  

侵删~

 

 

 

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值