首页 > 技术文章 > svm与matlab中的libsvm应用

manqing 2015-09-10 13:29 原文

  •  svm原理

有关svm教程以及教材已经很多,资料中介绍的都很详细。略过数学证明,用语言直观简洁地描述:svm就是一个可以控制参数改变分隔平面的一个二元分类器,得到1和-1的分类结果。除了分类,svm在加入了eps误差参数之后可根据点距离分隔平面的远近(?)给出具体的回归函数值(?),这时的support vector machine就变身成为support vector regression,也就是svr。

 

至于各个参数具体的意义和设置,我也还是一知半解,在以后的应用中慢慢再学习。

  • MATLAB中libsvm包的安装

大致按照http://jingyan.baidu.com/article/46650658048c3ff549e5f8c5.html的教程,只是在"Selelct a compiler"步骤中选择no:

 

matlab给出的是当前版本的matlab中可以支持的compiler。我选择了VC 2008,

 

然后将路径定位到软件所在文件夹就可以了。之后再按照上述的教程安装。

 

  • libsvm工具的使用

 1 clear
 2 clc
 3 riverdata=[8.07 48.8 0.27 0.0191 3.0;2.70 200.0 1.55 0.074 1500.0;2.35 70 0.43 0.10 110;
 4            3.84 72 0.76 0.13 260;0.85 47.0 0.32 0.067 14.0;2.10 60.0 0.94 0.104 54.0;
 5            2.1 53 0.83 0.107 47;0.4 19 0.16 0.116 9.9;0.85 34 0.15 0.055 9.5;
 6            0.76 64.0 0.67 0.27 35;1.56 24 0.71 0.043 9.6;1.1 59 0.88 0.12 42;
 7            2.16 69 1.55 0.17 160;0.94 26 0.34 0.067 33;0.91 37 0.4 0.067 39;
 8            2.04 104 0.58 0.05 315;4.75 127 0.64 0.08 670;0.49 16.0 0.27 0.08 20;
 9            0.85 18 0.6 0.1 21;0.58 25 1.01 0.14 14;2.47 34 0.82 0.18 65;
10            0.43 16 0.37 0.05 14;0.58 36 0.21 0.049 8.1];
11 riverdata_train=riverdata(1:16,1:4);
12 riverdata_trainlabels=riverdata(1:16,5);
13 riverdata_test=riverdata(17:23,1:4);
14 riverdata_testlabels=riverdata(17:23,5);
15 %优选参数
16 mse = 10^10;
17 for log2c = -10:10,
18    for log2g = -10:10,
19      cmd = ['-v 3 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g) , ' -s 3 -p 0.4 -n 0.1'];
20      cv = svmtrain(riverdata_trainlabels,riverdata_train,cmd);
21      if (cv < mse),
22        mse = cv; bestc = 2^log2c; bestg = 2^log2g;
23      end
24    end
25 end
26 % %输出参数
27 fprintf('(best c=%g, g=%g, mse=%g)\n',bestc, bestg, mse);
28 %构建模型
29 cmd = ['-c ', num2str(bestc), ' -g ', num2str(bestg) , ' -s 3 -p 0.4 -n 0.1'];
30 model = svmtrain(riverdata_trainlabels,riverdata_train,cmd);
31 %模型预测
32 [predict,mse]=svmpredict(riverdata_testlabels,riverdata_test,model);
33 %数据可视化
34 figure;plot(riverdata_testlabels,'b*-')
35 hold on;plot(predict,'k+-');
36 title('数据可视化');
37 legend('原始数据','回归数据');

这是从网上某个论坛cp下来的别人的一段代码,其中“优选参数”部分貌似是通用的一段程序(?)

用法很简单,需要的时候参考就好。

 

推荐阅读