LIBSVM做回归预测--终于弄通,很实用
- 格式:doc
- 大小:29.00 KB
- 文档页数:4
利⽤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(⼆)参数实例详解1. ⼊门案例1.1 分类的⼩例⼦--根据⾝⾼体重进⾏性别预测%% 使⽤Libsvm进⾏分类的⼩例⼦%{⼀个班级⾥⾯有两个男⽣(男⽣1、男⽣2),两个⼥⽣(⼥⽣1、⼥⽣2),其中男⽣1 ⾝⾼:176cm 体重:70kg;男⽣2 ⾝⾼:180cm 体重:80kg;⼥⽣1 ⾝⾼:161cm 体重:45kg;⼥⽣2 ⾝⾼:163cm 体重:47kg;如果我们将男⽣定义为1,⼥⽣定义为-1,并将上⾯的数据放⼊矩阵data中,并在label中存⼊男⼥⽣类别标签(1、-1)%}train_data = [176 70;180 80;161 45;163 47];train_label = [1;1;-1;-1];%{这样上⾯的data矩阵就是⼀个属性矩阵,⾏数4代表有4个样本,列数2表⽰属性有两个,label就是标签(1、-1表⽰有两个类别:男⽣、⼥⽣)。
%}% 利⽤libsvm建⽴分类模型此处options参数为默认值model = svmtrain(train_label,train_data);%{此时该班级⼜转来⼀个新学⽣,其⾝⾼190cm,体重85kg我们想给出其标签(想知道其是男[1]还是⼥[-1])由于其标签我们不知道,我们假设其标签为-1(也可以假设为1)%}test_data = [190 85];test_label = -1;[predict_label,accuracy,dec_value] = svmpredict(test_label,test_data,model);predict_labelif 1 == predict_labeldisp('==该⽣为男⽣');endif -1 == predict_labeldisp('==该⽣为⼥⽣');end1.2 回归的⼩例⼦ y=x^2 利⽤训练集合已知的x,y来建⽴回归模型 model ,然后利⽤这个 model 去预测。
%% 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⽀持向量机算法包的基本使⽤,此处演⽰的是⽀持向量回归机复制代码代码如下: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描述。
libsvm参数说明【原创实用版】目录1.LIBSVM 简介2.LIBSVM 参数说明3.LIBSVM 的使用方法4.LIBSVM 的应用场景5.总结正文1.LIBSVM 简介LIBSVM(Library for Support Vector Machines)是一个开源的支持向量机(SVM)算法库,它提供了一系列用于解决分类和回归问题的高效算法。
LIBSVM 由 Chenning Peng 和 Tsung-Yuan Lee 开发,是 SVM 领域最为知名和广泛使用的工具之一。
2.LIBSVM 参数说明LIBSVM 包含了许多参数,这些参数可以影响模型的性能。
以下是一些重要的 LIBSVM 参数及其说明:- "kernel": 指定核函数类型,如"linear"(线性核)、"rbf"(高斯径向基函数核)等。
- "C": 指定惩罚参数 C,用于控制模型对训练数据的拟合程度。
较小的 C 值会导致更宽松的边界,可能允许一些误分类,但可以提高模型的泛化能力。
较大的 C 值则会强制模型在训练集上尽量减少误差,可能导致过拟合。
- "degree": 指定多项式核函数的阶数。
- "gamma": 指定高斯核函数的参数,用于控制核函数的形状。
- "coef0": 指定拉格朗日乘子 alpha 的初始值。
- " CacheSize": 指定 LIBSVM 使用的内存缓存大小。
3.LIBSVM 的使用方法使用 LIBSVM 主要包括以下步骤:(1)数据预处理:将数据集分为特征矩阵 X 和目标向量 y。
(2)训练模型:调用 LIBSVM 的 train 函数,传入预处理后的数据和参数设置,训练 SVM 模型。
(3)预测:使用训练好的模型,调用 LIBSVM 的 predict 函数,对新的数据进行分类预测。
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)能把这句执行下去,就算等老半天也是值得的。
支持向量机回归算法(Support Vector Machine Regression,简称SVM Regression)是一种监督学习算法,用于解决回归问题。
它通过构建超平面来分割数据集,并使用特定的误差函数来评估模型的预测性能。
在SVM回归算法中,采用了一种称为ε-不敏感误差函数的方法。
该误差函数定义为,如果预测值与真实值之间的差值小于一个阈值ε,则不对此样本点做惩罚。
如果差值超过阈值,则惩罚量为
|yn−tn|−ε,其中yn是预测值,tn是真实值。
这种误差函数实际上形成了一个管道,在管道中样本点不做惩罚被称为
ε-tube。
SVM回归算法的目标是找到一个超平面,使得管道内的样本点数量最大化。
为了获得稀疏解,即计算超平面参数不依靠所有样本数据,而是部分数据,采用了这种误差函数来定义最小化误差函数作为优化目标。
由于上述目标函数含有绝对值项不可微,因此在实际应用中可能会遇到一些问题。
在训练SVM回归模型时,需要提前指定管道的宽度(即ε
的大小),并且算法引入了超参数C来控制对误差的惩罚程度。
在具体训练过程中,通过优化目标函数来找到最优的超平面和参数。
SVM回归算法可以应用于各种回归问题,如房价预测、股票价格预测等。
它的优点包括能够处理非线性问题、对异常值和噪声具有鲁棒性等。
然而,SVM回归算法也有一些局限性,例如在高维空间中可能会遇到维数灾难等问
题。
因此,在使用SVM回归算法时需要根据具体问题来选择合适的算法参数和核函数,并进行充分的实验验证和模型评估。
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> ...。
L i b S V M分类的实用指南LibSVM分类的实用指南摘要SVM(support vector machine)是一项流行的分类技术。
然而,初学者由于不熟悉SVM,常常得不到满意的结果,原因在于丢失了一些简单但是非常必要的步骤。
在这篇文档中,我们给出了一个简单的操作流程,得到合理的结果。
(译者注:本文中大部分SVM实际指的是LibSVM)1入门知识SVM是一项非常实用的数据分类技术。
虽然SVM比起神经网络(Neural Networks)要相对容易一些,但对于不熟悉该方法的用户而言,开始阶段通常很难得到满意的结果。
这里,我们给出了一份指南,根据它可以得到合理结果。
需要注意,此指南不适用SVM的研究者,并且也不保证一定能够获得最高精度结果。
同时,我们也没有打算要解决有挑战性的或者非常复杂的问题。
我们的目的,仅在于给初学者提供快速获得可接受结果的秘诀。
虽然用户不是一定要深入理解SVM背后的理论,但为了后文解释操作过程,我们还是先给出必要的基础的介绍。
一项分类任务通常将数据划分成训练集和测试集。
训练集的每个实例,包含一个"目标值(target value)"(例如,分类标注)和一些"属性(attribute)"(例如,特征或者观测变量)。
SVM的目标是基于训练数据产出一个模型(model),用来预测只给出属性的测试数据的目标值。
给定一个训练集,"实例-标注"对,,支持向量机需要解决如下的优化问题:在这里,训练向量xi通过函数Φ被映射到一个更高维(甚至有可能无穷维)空间。
SVM在这个高维空间里寻找一个线性的最大间隔的超平面。
C 0是分错项的惩罚因子(penalty parameter of the error term)。
被称之为核函数(kernel function)。
新的核函数还在研究中,初学者可以在SVM书中找到如下四个最基本的核函数:(线性、多项式、径向基函数、S型)1.1实例表1是一些现实生活中的实例。
SVM回归,也称为支持向量回归(SVR),其原理是找到一个最优的超平面,使得这个超平面与样本点的距离最小。
通过最小化这个距离,我们可以得到一个回归函数,该函数能够尽量拟合训练集样本。
为了实现这一目标,我们通常构建一个损失函数,该函数衡量模型预测值与样本标签之间的差异。
我们的目标是使这个损失函数最小化,从而确定最优的超平面。
为了实现这一点,SVR引入了一个额外的参数,称为ε。
这个参数定义了一个管道,在这个管道内的所有点都被认为是正确的预测。
SVR的目标是在保证所有样本点都在ε管道内的前提下,使超平面尽可能地平。
预测过程是通过计算测试样本点到最优超平面的距离来实现的。
如果这个距离在ε管道内,则我们认为预测是正确的;否则,我们认为预测是错误的。
总的来说,SVM回归是一种强大的机器学习技术,它能够处理具有高维特征的数据集,并且对噪声和异常值具有鲁棒性。
其基本思想是利用支持向量的性质来构建最优的回归函数。
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.txt
svm-predict test.txt data.txt.model out.txt
),干嘛还要下载python和gnuplot呢,其实了解svm理论的知道最核心的问题就是参数的选择,你不可能每次都很狗屎的猜到很好的参数,做出很好的预测,所以只能用这两个软件来寻参。
3,怎么寻参?核心的语句就这么一句,把dos框的路径调到C:\Python26,再键入
(python C:\libsvm-2.88\python\gridregression.py -svmtrain
C:\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)能把这句执行下去,就算等老半天也是值得的。
(下载的三个软件的路径调整问题下面补充,我是全部放在C盘的,省事。
)
4,有人会问含有gridregression.py的以上语句不能执行老是出错,这是什么原因呢?我也闷了半天,后来才知道gridregression.py 文件在台湾人的libsvm-2.88包里面是没有的,所以要自己去下载,要来后放在C:\libsvm-2.88\python里面就可以了。
5,回归会像分类那样调用easy.py(连grid.py都不需)一步到位麽?不是的这是有区别的,当你做完步骤四时,到C:\Python26中打开文件gridregression_data.parameter,里面有你要的参数c,g,p还有一个mse是没有用的,不用管他。
6,最后把dos框的路径调到C:\libsvm-2.88\windows,再执行
svm-train -s 3 -t 2 -c 1024.0 -g 0.0009765625 -p 0.0009765625 data.txt
svm-predict test.txt data.txt.model out.txt
搞定了,结果在C:\libsvm-2.88\windows的out.txt中!
7,忘了,三个软件长什么样和住哪里没有和你们说清楚,操之过急了哈。
分别在
C:\libsvm-2.88
C:\Python26
C:\gnuplot
这样应该详细了吧。
最后附上步骤3中的补充,其实还是想自己写,因为这样清楚,不过没力气了,转一下吧,网上帖子稍有不同,不过我选了一篇很清楚的:
首先我们需要下载libsvm,最新版是11月17日刚推出的libsvm2.83,可以在libsvm的主页.tw/~cjlin/libsvm/上下载得到,建议同时下载一个libsvm的初学者guide,写得很不错,浅显易懂,适合初学者使用,基本的使用只需要libsvm这一个软件即可,但如果需要使用它自带的python脚本的话,还需要安装python,最新版是2.5,可以在python的主页上下载。
另外,libsvm自带的两个脚本grid.py和easy.py 中均用到了绘图工具gnuplot,因此还需要下载一个gnuplot软件,下载地址:
ftp:///pub/gnuplot/,注意要下载win32版本的,比如win32的4.0版本对应的文件应为gp400win32.zip。
下载完成后,接下来就是安装。
其中只有python2.5需要安装(一般默认安装到c:\python25下),将libsvm解压到c:\libsvm下,将gnuplot解压到c:\gnuplot下。
将
c:\python25,c:\libsvm\windows,c:\gnuplot\bin三个文件夹添加到系统路径里面,方便日后使用。
安装完毕后,进入c:\libsvm\tools目录下,用文本编辑器(记事本,edit都可以)修改grid.py 和easy.py两个文件,找到其中关于gnuplot路径的那项,根据实际路径进行修改,并保存。
/blog/cns!7280d7d3cc41a4ab!564.entry
用gridregression.py搜索最优参数的方法如下:
python.exe gridregression.py -svmtrain H:\SVM\libsvm-2.81\windows\svmtrain.exe -gnuplot
C:\gp373w32\pgnuplot.exe -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2
H:\SVM\libsvm-2.81\windows\feature.scaled > gridregression_feature.parameter
注意:-svmtrain是给出svmtrain.exe所在路径,一定要是完整的全路径
-gnuplot是给出pgnuplot.exe所在路径。
这里要用pgnuplot.exe这种命令行形式的,不要用wgnupl32.exe,这个是图形界面的。
-log2c是给出参数c的范围和步长
-log2g是给出参数g的范围和步长
-log2p是给出参数p的范围和步长
上面三个参数可以用默认范围和步长
-s选择SVM类型,也是只能选3或者4
-t是选择核函数
-v 10 将训练数据分成10份做交叉验证。
默认为5
/user2/huangbo929/archives/2007/1714763.shtml。