虽然网络上已经有了很多的类似的东西了吧。但是呢,我自己还是要写一写的。
安装:
对于 libsvm工具包,我们可以去官方网站下载,网址为:http://www.csie.ntu.edu.tw/~cjlin/libsvm/,这上面有很好的介绍。
我下载的版本为 libsvm-3.22。下载完了以后,可以查看到文件夹里面的内容。(其中,的一个heart_scale的matlab格式的文件是我自己在网上下载的)
里面的 matlab文件夹里的内容就是我们要用到的内容(里面有的文件我已经编译好了,即 .mexw64的相关文件)。里面有一个README 的文件,可以读读,作出了相关的介绍。
虽然在windows文件夹下有给出了 .mexw64的文件,但是我偿试过,没有办法用,所以呢,对于用c++下的 svmtrain.c、svmpredict、libsvmread.c、libsvmwrite.c(这四个文件是主要的)文件我们要把它编译成matlab可以使用的以.mexw64的文件。。(注意,在64位下是以.mexw64结尾,在32位下应该是以.mexw32结尾).
以上简单说了一下 文件夹内的东西,现在正式说说安装过程吧。
1. 下载工具包;(可以在官网下载,我同时也提供了我下载的并且我编译过的工具包,http://pan.baidu.com/s/1hsmR1li)
2. 我们把工具包里的 matlab 文件夹下的的.c文件编译为matlab软件可以使用的.mexw64文件.
我们要做的是在matlab里编译c++文件,我们要配置matlab的编译器,matlab自身好像自代了一个 lcc的编译器,不过我的没有。如果你的电脑安装了其它的编译器,我们就可以使用它。(注意一点,matlab支持的编译器必须低于当前的matlab的版本,例如我的matlab为2012b版本,它就不支持vs2012版本,我又安装了vs2010版本,它就支持了,通过https://cn.mathworks.com/support/sysreq/previous_releases.html可以自己查看下自己的版本以及支持的编译器)。如何配置:
1)在matlab中输入:
mex –setup再选择 y, 会出现这样的:
然后选择一个默认的编译器就可以了,我这里只有 visual c++ 2010,也只能选择它了。
2)配置完默认的编译器,我们就编译我们的在matlab文件夹下的 .c 文件吧。。让我们把当前目录切换到 matlab文件夹下,里面有一个 make.m 的文件,里面的内容就是编译的指令,我们直接运行它就可以(你可以选中文件右击选择run,也可以在命令窗口直接输入make 回车)。运行完了以后呢,就生成了 .mexw64的文件了。
3. 对于要不要设置matlab的搜索路经的问题,可以设置,也可以直接把matlab文件夹作用当前目录使用 svmtrain等函数。 我使用的后者。(另外注意一点,在matlab的自代工具箱里面也有一个svmtrain的函数,如果你设置了路经,记得把我们下载的工具箱的路经设在第一位置了,要不会调用错的)
4. 验证一下能否使用。
在下载的工具箱文件夹里面有一个 heart_scale的文件,这个是c++能打开的文件,我们直接使用load搞不定的。把这个文件复制到matlab文件夹下,使用 libsvmread 载入;方法为:
[label_vector, instance_matrix] = libsvmread(\'filename\')
另个有我的文件包里面也包含了 heart_scale.mat文件,可以直接用load 载入的,下图为直接load 载入:
有了数据集,我们就那建立模型,用于分类预测:
model = svmtrain(heart_scale_label, heart_scale_inst); [predict_label] = svmpredict(heart_scale_label, heart_scale_inst, model);
下图为输出:
5 ,搞定。
工具箱的简单使用:
http://blog.csdn.net/bryan__/article/details/51506801
多分类问题怎么解决呢?通常把多分类问题分解为一系列SVM可直接求解的两分类问题。在此思想上,通常有以下方法:
1. 一类对余类法,听这个名字就知道是什么意思,如果一共有K类,那么最后训练一共有K个SVM。 判别时,输入信号分别经过k个分类机共得到k个输出值fi(x)=sgn(gi(x)),若只有一个+1出现,则其对应类别为输入信号类别;若输出不只一个+1(不只一类声称它属于自己),或者没有一个输出为+1(即没有一个类声称它属于自己),则比较g(x)输出值,最大者对应类别为输入的类别。
2. 一对一分类法。。如果一共有K类的话,那么最终得到的SVM为P=k(k-1)/2个。 判别时,将输入信号X分别送到P个判别函数f(x),若f(x)=+1,判X为i类,i类获得一票,否则判为j类,j类获得一票。分别统计k个类别在P个判别函数结果中的得票数,得票数最多的类别就是最终判定类别。
上面为最简单的最常用的方法, 另外还有其它方法,不介绍了。
建模时用到的参数:(来自http://www.matlabsky.com/thread-12380-1-1.html)
Options:可用的选项即表示的涵义如下 -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(-gamma|u-v|^2) 3 –sigmoid:tanh(r*u\'v + coef0) -d degree:核函数中的degree设置(针对多项式核函数)(默认3) -g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k) -r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0) -c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1) -n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5) -p p:设置e -SVR 中损失函数p的值(默认0.1) -m cachesize:设置cache内存大小,以MB为单位(默认40) -e eps:设置允许的终止判据(默认0.001) -h shrinking:是否使用启发式,0或1(默认1) -wi weight:设置第几类的参数C为weight*C(C-SVC中的C)(默认1) -v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
其中-g选项中的k是指输入数据中的属性数。option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影
响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
http://blog.csdn.net/bryan__/article/details/51506801写的也很好。
其中写到:SVM模型有两个非常重要的参数C与gamma。其中 C是惩罚系数,即对误差的宽容度。c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差
gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
这里有一个用于参数c与g选择的相关知识:http://www.ilovematlab.cn/thread-47819-1-1.html
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
http://www.cnblogs.com/zhizhan/p/4412343.html也写的很好的啊。
比如:写到了为什么要选择RBF??
通常而言,RBF核是合理的首选。这个核函数将样本非线性地映射到一个更高维的空间,与线性核不同,它能够处理分类标注和属性的非线性关系。并且,线性核是RBF的一个特例(Keerthi and Lin 2003),因此,使用一个惩罚因子C的线性核与某些参数(C,γ)的RBF核具有相同的性能。同时,Sigmoid核的表现很像一定参数的RBF核(Lin and Link 2003)。
第二个原因,超参数(hyperparameter)的数量会影响到模型选择的复杂度(因为参数只能靠试验呀!)。多项式核比RBF核有更多的超参数。
最后,RBF核有更少的数值复杂度(numerical difficulties)。一个关键点0<Kij<=1对比多项式核,后者关键值需要 infinity(rxiTxj+r>1)或者zero(rxiTxj+r<1),这是高阶运算。此外,我们必须指出sigmoid核在某些参数下不是合法的 (例如,不是两个向量的内积)。(Vapnik 1995)。