如何使用libsvm进行回归预测
利用Matlab_libsvm构造支持向量机回归算法

利⽤Matlab_libsvm构造⽀持向量机回归算法ticclear;clc;Fnum = 4; %输⼊个数/输出个数只能为1个TnumX = 0.8; %训练数据⽐例Terror = 0.2; %误差⼩于Terror的预测⽐例eps = 10^(-7); %误差阈值v=6; %交互检验% 寻找最佳c参数/g参数 CVcmax = 10;cmin = -10;gmax = 10;gmin = -10;cstep = 1;gstep = 1;msestep = 0.05;local = 'C:\Users\37989\Desktop\2688.xlsx';%数据⽂件地址data = xlsread(local);[Ynum,Xnum] = size(data);Train = data(randperm(Ynum),:);Tnum = round(TnumX * Ynum);TSnum = Ynum - Tnum; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%主要修改以上数据%以下代码不要修改% 训练集p_train = Train(1:Tnum,1:Fnum);%2:4 是回弹后的零件 5列是分组标记t_train = Train(1:Tnum,Fnum+1);% 测试集p_test = Train(Tnum + 1:Ynum,1:Fnum); %这个改了 R8000⽣成的只有3列t_test = Train(Tnum + 1:Ynum,Fnum+1);%⽆所谓%% 数据归⼀化% 训练集[pn_train,inputps] = mapminmax(p_train'); %归⼀化⽅法?pn_train = pn_train';[tn_train,outputps] = mapminmax(t_train');tn_train = tn_train';% 测试集pn_test = mapminmax('apply',p_test',inputps);pn_test = pn_test';tn_test = mapminmax('apply',t_test',outputps);tn_test = tn_test';%% SVM模型创建/训练% 寻找最佳c参数/g参数 CV[c,g] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);[m,n] = size(c);cg = zeros(m,n);bestc = 0;bestg = 0;error1= Inf;count=1;%循环前h=waitbar(0,'正在计算....');for i = 1:ma=i;for j = 1:n%寻优的cmd参数应该与下⽂训练的cmd相符cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(a,j)),' -g ',num2str(2^g(a,j) ),' -s 3 -p 0.1 -q'];%0.01 cg(a,j) = svmtrain(tn_train,pn_train,cmd)*10000;if cg(a,j) < error1error1 = cg(a,j); %回归均⽅根误差bestc = 2^c(a,j);bestg = 2^g(a,j);endif abs(cg(a,j) - error1) <= eps && bestc > 2^c(a,j) %两次的mse相差很⼩取c较⼩的error1 = cg(a,j);bestc = 2^c(a,j);bestg = 2^g(a,j);endwaitbar(count/(m*n),h);count=count+1;endend[cg,ps] = mapminmax(cg,0,1);figure;set(gcf,'position',[0,100,1366,500]);%1 3 是宽度 2 4 是⾼度subplot(1,2,1)[C,h] = contour(c,g,cg,0.0023:msestep:0.5);clabel(C,h,'FontSize',14,'Color','r');xlabel('log_2C','FontName','Times','FontSize',14);ylabel('log_2g','FontName','Times','FontSize',14);firstline = 'SVR参数选择结果图(等⾼线图)[GridSearchMethod]';secondline = ['Best C=',num2str(bestc),' g=',num2str(bestg), ...' CVmse=',num2str(error1)];title({firstline;secondline},'Fontsize',14);grid on;set(gca,'xtick',[cmin:cstep:cmax]);set(gca,'ytick',[gmin:gstep:gmax]);subplot(1,2,2)meshc(c,g,cg);% mesh(X,Y,cg);% surf(X,Y,cg);axis([cmin,cmax,gmin,gmax,0,1]);xlabel('log_2C','FontName','Times','FontSize',14);ylabel('log_2g','FontName','Times','FontSize',14);zlabel('MSE','FontName','Times','FontSize',14);firstline = 'SVR参数选择结果图(3D视图)[GridSearchMethod]';secondline = ['Best C=',num2str(bestc),' g=',num2str(bestg), ...' CVmse=',num2str(error1)];title({firstline;secondline},'Fontsize',14);%% 创建/训练SVM%参考libsvm使⽤说明对cmd参数修改cmd=[' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -p 0.001 '];model = svmtrain(tn_train,pn_train,cmd);%% SVM仿真预测[Predict_2,error_2,decision_values] = svmpredict(tn_test,pn_test,model);% 反归⼀化F= mapminmax('reverse',Predict_2,outputps);toc%% 输出结果E =F - t_test;E =F - t_test;percent=sum(E<Terror)/TSnum*100;MSE=sum(E.^2)/TSnum;mse_norm =error_2(2);R2=error_2(3);SD=std(E);Result=[t_test,F,abs(t_test-F)];fprintf('%4.3f\t%4.3f\t%4.3f\n',Result');fprintf(['\nc=%4.4f g=%4.4f\nSTD=%4.4f MSE=%4.4f R^2 =%4.5f Max=%4.4f',... ' Min =%4.4f Range=%4.4f 误差在%s内=%4.2f%%\n'],bestc,bestg,SD,MSE,... R2,max(E),min(E),max(E)-min(E),num2str(Terror),percent)。
libsvm使用详细文档2

LIBSVM软件包简介简介LIBSVM是台湾大学林智仁(Chih-Jen Lin) 博士等开发设计的一个操作简单、易于使用、快速有效的通用SVM 软件包。
可以解决分类问题(包括C- SVC 、n - SVC )回归问题(包括e - SVR 、n - SVR )分布估计(one-class-SVM )等问题提供了四种常用的核函数供选择线性、多项式、径向基和S形函数可以有效地解决多类问题、交叉验证选择参数、对不平衡样本加权、多类问题的概率估计等。
LIBSVM 是一个开源的软件包,需要者都可以免费的从作者的个人主页.tw/~cjlin/ 处获得。
他不仅提供了LIBSVM 的C++ 语言的算法源代码,还提供了Python 、Java 、R 、MATLAB 、Perl 、Ruby 、LabVIEW以及C#.net 等各种语言的接口,可以方便的在Windows 或UNIX 平台下使用,也便于科研工作者根据自己的需要进行改进(譬如设计使用符合自己特定问题需要的核函数等)。
另外还提供了WINDOWS 平台下的可视化操作工具SVM-toy ,并且在进行模型参数选择时可以绘制出交叉验证精度的等高线图。
SVM进行函数估计是有监督学习,进行概率密度估计是非监督学习自从版本2.8以后libsvm采用SMO算法安装环境下载文件下载Libsvm2.88、Python2.4(默认安装在D:)和Gnuplot配置文件的路径Python2.4文件路径如下:Gnuplot路径设置Gnuplot不是安装文件,直接放在tmp目录即可另一个工具就是gnuplot.exe,下载不是安装文件:安装完上面的软件还不能运行,还要修改easy.py,grid.py的设置.,以写字板的格式打开easy.py:如下:将他们对应的代码" gnuplot_exe = r"c:\tmp\gnuplot\bin\pgnuplot.exe""都改为你的pgnuplot.exe 所在的路径,比如我的文件在当前目录的上一级目录,就是和tools文件夹在同一级目录,那么我的设置应该为" gnuplot_exe = r"..\gnuplot\bin\pgnuplot.exe"".本人使用的上边一种方法(测试通过),事实上也符合下面的方式,为了保险起见。
matlab30个案例分析案例14-SVM神经网络的回归预测分析

%% SVM神经网络的回归预测分析---上证指数开盘指数预测%%% 清空环境变量function chapter14tic;close all;clear;clc;format compact;%% 数据的提取和预处理% 载入测试数据上证指数(1990.12.19-2009.08.19)% 数据是一个4579*6的double型的矩阵,每一行表示每一天的上证指数% 6列分别表示当天上证指数的开盘指数,指数最高值,指数最低值,收盘指数,当日交易量,当日交易额.load chapter14_sh.mat;% 提取数据[m,n] = size(sh);ts = sh(2:m,1);tsx = sh(1:m-1,:);% 画出原始上证指数的每日开盘数figure;plot(ts,'LineWidth',2);title('上证指数的每日开盘数(1990.12.20-2009.08.19)','FontSize',12);xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);ylabel('开盘数','FontSize',12);grid on;% 数据预处理,将原始数据进行归一化ts = ts';tsx = tsx';% mapminmax为matlab自带的映射函数% 对ts进行归一化[TS,TSps] = mapminmax(ts,1,2);% 画出原始上证指数的每日开盘数归一化后的图像figure;plot(TS,'LineWidth',2);title('原始上证指数的每日开盘数归一化后的图像','FontSize',12);xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);ylabel('归一化后的开盘数','FontSize',12);grid on;% 对TS进行转置,以符合libsvm工具箱的数据格式要求TS = TS';% mapminmax为matlab自带的映射函数% 对tsx进行归一化[TSX,TSXps] = mapminmax(tsx,1,2);% 对TSX进行转置,以符合libsvm工具箱的数据格式要求TSX = TSX';%% 选择回归预测分析最佳的SVM参数c&g% 首先进行粗略选择:[bestmse,bestc,bestg] = SVMcgForRegress(TS,TSX,-8,8,-8,8);% 打印粗略选择结果disp('打印粗略选择结果');str = sprintf( 'Best Cross Validation MSE = %g Best c = %g Best g = %g',bestmse,bestc,bestg); disp(str);% 根据粗略选择的结果图再进行精细选择:[bestmse,bestc,bestg] = SVMcgForRegress(TS,TSX,-4,4,-4,4,3,0.5,0.5,0.05);% 打印精细选择结果disp('打印精细选择结果');str = sprintf( 'Best Cross Validation MSE = %g Best c = %g Best g = %g',bestmse,bestc,bestg); disp(str);%% 利用回归预测分析最佳的参数进行SVM网络训练cmd = ['-c ', num2str(bestc), ' -g ', num2str(bestg) , ' -s 3 -p 0.01'];model = svmtrain(TS,TSX,cmd);%% SVM网络回归预测[predict,mse] = svmpredict(TS,TSX,model);predict = mapminmax('reverse',predict',TSps);predict = predict';% 打印回归结果str = sprintf( '均方误差MSE = %g 相关系数R = %g%%',mse(2),mse(3)*100);disp(str);%% 结果分析figure;hold on;plot(ts,'-o');plot(predict,'r-^');legend('原始数据','回归预测数据');hold off;title('原始数据和回归预测数据对比','FontSize',12);xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);ylabel('开盘数','FontSize',12);grid on;figure;error = predict - ts';plot(error,'rd');title('误差图(predicted data - original data)','FontSize',12);xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);ylabel('误差量','FontSize',12);grid on;figure;error = (predict - ts')./ts';plot(error,'rd');title('相对误差图(predicted data - original data)/original data','FontSize',12);xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);ylabel('相对误差量','FontSize',12);grid on;snapnow;toc;%% 子函数SVMcgForRegress.mfunction [mse,bestc,bestg] = SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)%SVMcg cross validation by faruto%% by faruto%Email:patrick.lee@ QQ:516667408 /faruto BNU%last modified 2010.01.17%Super Moderator @ % 若转载请注明:% faruto and liyang , LIBSVM-farutoUltimateVersion% a toolbox with implements for support vector machines based on libsvm, 2009.% Software available at %% Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for% support vector machines, 2001. Software available at% .tw/~cjlin/libsvm% about the parameters of SVMcgif nargin < 10msestep = 0.06;endif nargin < 8cstep = 0.8;gstep = 0.8;endif nargin < 7v = 5;endif nargin < 5gmax = 8;gmin = -8;endif nargin < 3cmax = 8;cmin = -8;end% X:c Y:g cg:acc[X,Y] = meshgrid(cmin:cstep:cmax,gmin:gstep:gmax);[m,n] = size(X);cg = zeros(m,n);eps = 10^(-4);bestc = 0;bestg = 0;mse = Inf;basenum = 2;for i = 1:mfor j = 1:ncmd = ['-v ',num2str(v),' -c ',num2str( basenum^X(i,j) ),' -g ',num2str( basenum^Y(i,j) ),' -s 3 -p 0.1'];cg(i,j) = svmtrain(train_label, train, cmd);if cg(i,j) < msemse = cg(i,j);bestc = basenum^X(i,j);bestg = basenum^Y(i,j);endif abs( cg(i,j)-mse )<=eps && bestc > basenum^X(i,j)mse = cg(i,j);bestc = basenum^X(i,j);bestg = basenum^Y(i,j);endendend% to draw the acc with different c & g[cg,ps] = mapminmax(cg,0,1);figure;[C,h] = contour(X,Y,cg,0:msestep:0.5);clabel(C,h,'FontSize',10,'Color','r');xlabel('log2c','FontSize',12);ylabel('log2g','FontSize',12);firstline = 'SVR参数选择结果图(等高线图)[GridSearchMethod]'; secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...' CVmse=',num2str(mse)];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,0,1]);xlabel('log2c','FontSize',12);ylabel('log2g','FontSize',12);zlabel('MSE','FontSize',12);firstline = 'SVR参数选择结果图(3D视图)[GridSearchMethod]'; secondline = ['Best c=',num2str(bestc),' g=',num2str(bestg), ...' CVmse=',num2str(mse)];title({firstline;secondline},'Fontsize',12);。
libsvm支持向量机回归示例

libsvm⽀持向量机回归⽰例libsvm⽀持向量机算法包的基本使⽤,此处演⽰的是⽀持向量回归机复制代码代码如下:import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.util.ArrayList;import java.util.List;import libsvm.svm;import libsvm.svm_model;import libsvm.svm_node;import libsvm.svm_parameter;import libsvm.svm_problem;public class SVM {public static void main(String[] args) {// 定义训练集点a{10.0, 10.0} 和点b{-10.0, -10.0},对应lable为{1.0, -1.0}List<Double> label = new ArrayList<Double>();List<svm_node[]> nodeSet = new ArrayList<svm_node[]>();getData(nodeSet, label, "file/train.txt");int dataRange=nodeSet.get(0).length;svm_node[][] datas = new svm_node[nodeSet.size()][dataRange]; // 训练集的向量表for (int i = 0; i < datas.length; i++) {for (int j = 0; j < dataRange; j++) {datas[i][j] = nodeSet.get(i)[j];}}double[] lables = new double[label.size()]; // a,b 对应的lablefor (int i = 0; i < lables.length; i++) {lables[i] = label.get(i);}// 定义svm_problem对象svm_problem problem = new svm_problem();problem.l = nodeSet.size(); // 向量个数problem.x = datas; // 训练集向量表problem.y = lables; // 对应的lable数组// 定义svm_parameter对象svm_parameter param = new svm_parameter();param.svm_type = svm_parameter.EPSILON_SVR;param.kernel_type = svm_parameter.LINEAR;param.cache_size = 100;param.eps = 0.00001;param.C = 1.9;// 训练SVM分类模型System.out.println(svm.svm_check_parameter(problem, param));// 如果参数没有问题,则svm.svm_check_parameter()函数返回null,否则返回error描述。
svm

2 数据缩放
• 简单的数据缩放操作说明。 • svm-scale空格[-l lower]空格[-u upper]空格[-s name1]空格[-r name2]空格filename • [ ]的内容是可以省略的。 • -l:数据下限标记;-u:数据上限标记;如缺省表示范围为[-1,1] • -s name1:表示将缩放的规则保存为文件name1; • -r name2:表示将缩放规则文件name2载入后按此缩放; • filename:待缩放的数据文件
核函数
• 径向基函数(RBF)主要是利用“两个向量夹角越小其内积越 大”的思想。其定义 ,当 u 和 v 比较接近 是(u-v)的模值较小,其核函数值接近1,当 u 和 v 相差很大 时,其核函数值接近0。因其函数类似于高斯分布,故也 称其为高斯核函数。 • 将原问题中内积的运算,换为核函数,则得到svm算法的 规划问题。 • 当然选取不同的核函数得到的结果是不一样的,针对一个 数据集什么样的核函数是最佳的,这也是一个问题。
测试数据1, 模型数据1.model 输出结果1.out
显示准确率,一共270组数据,270组预测正确
• 在训练时我们选用惩罚因子c=2048(svm-train –c 2048 1),此参数 是进行优化选择后推荐的,可以达到100%的准确率。
参数优化选择
• 针对C-SVC,主要待定参数为:
• -g r:核函数中的r参数设置(默认1/ k) • -c c:设置C-SVC的惩罚因子C(默认1)
作为对这种偏离
C-SVC 模型
3.1常用options说明
• -c c:设置C-SVC的惩罚因子C(默认c选1) • -wi weight:设置参数C(weight*C )(默认weight 1)
LIBSVM做回归预测--终于弄通,很实用

LIBSVM做回归预测--终于弄通看了网上很多帖子和博客,自己琢磨了很久到现在才弄明白怎么用libsvm来做预测。
因为网上的帖子一般都是转来转去的,所以第一个人感觉这样写详细了,之后的人不管懂不懂照搬不误,这就苦了我们笨的人啦。
不过我研究了一天,终于有点眉目,写点体会,应该会比较详细吧,至少是过来人碰到的问题。
p.s.这里暂且不讨论分类问题,其实分类比预测简单,下载下来的libsvm-2.88早已有easy.py 可以直接拿来做,所以简单,一步到位,之后如果有空就写写!用libsvm做回归的人有的疑惑大致有这些:1,怎么把数据整理成规定格式,我以前的帖子写了,只要用一个带有宏的excel就能搞定,话不多说。
2,有人会说svm就打几条命令就能得出结果(svm-train -s 3 -t 2 -c 1024.0 -g 0.0009765625 -p 0.0009765625 data.txtsvm-predict test.txt data.txt.model out.txt),干嘛还要下载python和gnuplot呢,其实了解svm理论的知道最核心的问题就是参数的选择,你不可能每次都很狗屎的猜到很好的参数,做出很好的预测,所以只能用这两个软件来寻参。
3,怎么寻参?核心的语句就这么一句,把dos框的路径调到C:\Python26,再键入(python C:\libsvm-2.88\python\gridregression.py -svmtrainC:\libsvm-2.88\windows\svm-train.exe -gnuplot C:\gnuplot\bin\pgnuplot.exe -log2c -10,10,1-log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 C:\libsvm-2.88\python\data.txt >gridregression_data.parameter)能把这句执行下去,就算等老半天也是值得的。
libsvm使用说明
Libsvm是一个简单,易于使用和高效的SVM软件分类和回归。
它解决了C-SVM分类,nu-SVM分类,一类SVM,ε-SVM回归和nu-SVM回归。
它还提供了一个自动模型选择工具C-SVM分类。
本文档介绍了libsvm的使用。
Libsvm可在.tw/~cjlin/libsvm在使用libsvm之前,请先阅读COPYRIGHT文件。
目录=================- 快速开始- 安装和数据格式- `svm-train'用法- `svm-predict'用法- `svm-scale'用法- 实用技巧- 例子- 预先计算的内核- 图书馆使用- Java版本- 构建Windows二进制文件- 附加工具:子采样,参数选择,格式检查等- MATLAB / OCTAVE接口- Python接口- 附加信息快速开始===========如果您是SVM的新手,如果数据不大,请转到`tools'目录,并在安装后使用easy.py。
它是一切都是自动的- 从数据缩放到参数选择。
用法:easy.py training_file [testing_file]有关参数选择的更多信息,请参见`工具/自述文件'。
安装和数据格式============================在Unix系统上,键入`make'来构建`svm-train'和`svm-predict'程式。
运行他们没有参数,以显示他们的用法。
在其他系统上,请参阅“Makefile”来构建它们(例如,在此文件中构建Windows二进制文件)或使用预构建的二进制文件(Windows二进制文件位于目录“windows”中)。
培训和测试数据文件的格式是:<label> <index1>:<value1> <index2>:<value2> ...。
libsvm参数说明
libsvm参数说明(实用版)目录1.引言2.LIBSVM 简介3.LIBSVM 参数说明4.使用 LIBSVM 需要注意的问题5.结束语正文1.引言支持向量机(Support Vector Machine, SVM)是一种非常强大和灵活的监督学习算法,它可以用于分类和回归任务。
在 SVM 的研究和应用中,LIBSVM 是一个非常重要的工具,它为 SVM 的实现和应用提供了强大的支持。
本文将对 LIBSVM 的参数进行详细的说明,以帮助读者更好地理解和使用这个工具。
2.LIBSVM 简介LIBSVM 是一个开源的 SVM 实现库,它提供了丰富的功能和接口,可以支持多种操作系统,包括 Windows、Linux 和 Mac OS 等。
LIBSVM 主要包括三个部分:svm-train、svm-predict 和 svm-plot。
svm-train 用于训练 SVM 模型,svm-predict 用于预测新数据,svm-plot 用于绘制各种图表,以便于观察和分析模型性能。
3.LIBSVM 参数说明LIBSVM 的参数设置对于模型的性能至关重要。
以下是一些常用的参数及其说明:- -train:用于指定训练数据的文件名。
- -test:用于指定测试数据的文件名。
- -model:用于指定模型文件的名称。
- -参数:用于设置 SVM 模型的参数,例如 C、核函数等。
- -cache-size:用于设置缓存大小,以加速训练过程。
- -tolerance:用于设置收敛阈值,控制训练过程的终止条件。
- -shrinking:用于设置是否使用启发式方法进行训练。
- -probability:用于设置是否计算预测概率。
4.使用 LIBSVM 需要注意的问题在使用 LIBSVM 时,需要注意以下问题:- 设置合适的参数:LIBSVM 的参数设置对模型性能有很大影响,需要根据具体问题和数据集进行调整。
- 特征选择:在实际应用中,特征选择对于模型性能至关重要。
LIBSVM使用方法
LIBSVM1 LIBSVM简介LIBSVM是台湾大学林智仁(Lin Chih-Jen)副教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包,他不但提供了编译好的可在Windows 系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;该软件还有一个特点,就是对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数就可以解决很多问题;并且提供了交互检验(Cross -SVM回归等问题,包括基于一对一算法的多类模式识别问题。
SVM用于模式识别或回归时,SVM方法及其参数、核函数及其参数的选择,目前国际上还没有形成一个统一的模式,也就是说最优SVM算法参数选择还只能是凭借经验、实验对比、大范围的搜寻或者利用软件包提供的交互检验功能进行寻优。
ν-SVM回归和ε-SVM分类、νValidation)的功能。
该软件包可以在.tw/~cjlin/免费获得。
该软件可以解决C-SVM分类、-SVM回归等问题,包括基于一对一算法的多类模式识别问题。
SVM用于模式识别或回归时,SVM方法及其参数、核函数及其参数的选择,目前国际上还没有形成一个统一的模式,也就是说最优SVM算法参数选择还只能是凭借经验、实验对比、大范围的搜寻或者利用软件包提供的交互检验功能进行寻优。
2 LIBSVM使用方法LibSVM是以源代码和可执行文件两种方式给出的。
如果是Windows系列操作系统,可以直接使用软件包提供的程序,也可以进行修改编译;如果是Unix类系统,必须自己编译,软件包中提供了编译格式文件,我们在SGI工作站(操作系统IRIX6.5)上,使用免费编译器GNU C++3.3编译通过。
2.1 LIBSVM 使用的一般步骤:1) 按照LIBSVM软件包所要求的格式准备数据集;2) 对数据进行简单的缩放操作;3) 考虑选用RBF 核函数;4) 采用交叉验证选择最佳参数C与g;5) 采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;6) 利用获取的模型进行测试与预测。
SVM模式识别与回归软件包(LibSVM)详解
SVM模式识别与回归软件包(LibSVM)详解SVM模式识别与回归软件包――LibSVMSVM用于模式识别或回归时,SVM方法及其参数、核函数及其参数的选择,目前国际上还没有形成一个统一的模式,也就是说最优SVM算法参数选择还只能是凭借经验、实验对比、大范围的搜寻或者利用软件包提供的交互检验功能进行寻优。
目前,LIBSVM拥有Java、Matlab、C#、Ruby、Python、R、Perl、Common LISP、LabView等数十种语言版本。
最常使用的是Matlab、Java和命令行的版本。
2:处理数据,把数据制作成LIBSVM的格式,其每行格式为: label index1:value1 index2:value2 ...其中我用了复旦的分类语料库,当然我先做了分词,去停用词,归一化等处理了 3:使用svm-train.exe训练,得到****.model文件。
里面有支持向量,gamma值等信息 4:使用svm-predict.exe做测试这里有几个问题现在必须说明:1:有关数据格式, index1:value1 index2:value2 ...这里面的index1,index2必须是有序的。
我测试了好多次才发现了这个问题,因为我原来做实验的数据室不必有序的。
2:有关python语言,python有些版本不同导致一些语法也是有差异的,建议使用低版本的,如2.6,比如2.6和3.*版本的有关print的规定是有差别的。
这几个.exe文件里面很多参数可以调的,我暂时是想学习下所以都只用了默认值了。
现在做好标记,以后要真做实验用他可以随时用上!2.准备好数据,首先要把数据转换成Libsvm软件包要求的数据格式为: labelindex1:value1 index2:value2 ...其中对于分类来说label为类标识,指定数据的种类;对于回归来说label为目标值。
(我主要要用到回归)Index是从1开始的自然数,value是每一维的特征值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
强烈建议您看这个之前先好好看看这个:
如何使用libsvm进行分类【by faruto】
/forum-v ... -fromuid-18677.html
这里将这个帖子记为(帖子*)
其实我个人感觉分类和回归本质一样的,分类搞清楚了的话,回归也就应该会的了。
但有
好多朋友对于使用libsvm进行分类会了,但使用libsvm进行回归就行不明白,我也搞不懂,道理都一样的啊,我最开始接触libsvm的时候就是弄明白分类然后回归自然而然就明白了
的啊!
好吧,不管了,还是在这里把使用libsvm进行回归预测也说说吧~。
回归和分类本质都是一样,就是有一个输入(属性矩阵或者自变量)然后有输出(分类是
分类标签,回归是因变量),也就是相当于一个函数:
Y = f(x)利用训练集合已知的x,y来建立回归模型model,然后用这个model
去预测。
这里面的x就相当于帖子*中的那个属性矩阵data,y相当于帖子*中的label,这样理解就很简单了。
我们看下面一个简单的利用libsvm进行回归的例子:
1.%% HowToRegressUsingLibsvm
2.% by faruto @ faruto's Studio~
3.% /faruto
4.% Email:faruto@
5.%
6.%
7.%
8.% last modified by 2010.12.28
9.%% a litte clean work
10.tic;
11.close all;
12.clear;
13.clc;
14.format compact;
15.%%
16.
17.% 生成待回归的数据
18.x = (-1:0.1:1)';
19.y = -x.^2;
20.
21.% 建模回归模型
22.model = svmtrain(y,x,'-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01');
23.
24.% 利用建立的模型看其在训练集合上的回归效果
25.[py,mse] = svmpredict(y,x,model);
26.figure;
27.plot(x,y,'o');
28.hold on;
29.plot(x,py,'r*');
30.legend('原始数据','回归数据');
31.grid on;
32.
33.% 进行预测
34.testx = 1.1;
35.display('真实数据')
36.testy = -testx.^2
37.
38.[ptesty,tmse] = svmpredict(testy,testx,model);
39.display('预测数据');
40.ptesty
41.
42.%%
43.toc
复制代码
运行结果:
1.Mean squared error = 9.52768e-005 (regression)
2.Squared correlation coefficient = 0.999184 (regression)
3.真实数据
4.testy =
5. -1.2100
6.Mean squared error = 0.0102555 (regression)
7.Squared correlation coefficient = -1.#IND (regression)
8.预测数据
9.ptesty =
10. -1.1087
11.Elapsed time is 0.133552 seconds.
复制代码
上面的代码是对于二次函数y = x^2在[-1,1]上进行回归,并对于testx=1.1进行预测,这
里面由于我们知道真实的因变量testy = -1.21,按道理说做预测是不知道待预测的目标量
是什么的,否则还预测什么?这里就有好多朋友产生疑惑,说如果不知道待预测的目标量
是什么怎么办?答曰:那就随便写一个就行啊!然后又有的朋友会说,那这样生成的回归
指标(mse均方根误差,和平方回归系数很不理想啊),操~本身真实的因变量都不知道,这些参考指标在真实的因变量不知道的情况下是没有参考价值的。
以前我看到这样的问题,真的抓狂,就不能自己动脑子稍微想一下吗!?
上面使用的参数说明:
-s svm类型:SVM设置类型(默认0)
0 -- C-SVC
1 --v-SVC
2 –一类SVM
3 -- e -SVR
4 -- v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 –线性:u'v
1 –多项式:(r*u'v + coef0)^degree
2 – RBF函数:exp(-r|u-v|^2)
3 –sigmoid:tanh(r*u'v + coef0)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) -c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
-p p:设置e -SVR 中损失函数p的值(默认0.1)。