SVM(支持向量机)作为火了很久的算法,无论是在分类、回归、建模等方向都有“带头大哥”的作用。以此记录缓慢的科研过程。

一、理论和数据前期准备

(1)SVM的一般使用的形式为:

train_set=xlsread('C:\Users\Admin\Desktop\traindata.xlsx');
train_set_labels=xlsread('C:\Users\Admin\Desktop\trainlabel.xlsx');
test_set=xlsread('C:\Users\Admin\Desktop\testdata1.xlsx');
test_set_labels=xlsread('C:\Users\Admin\Desktop\testlabel1.xlsx');

案例中,将需要分类的特征数据存放到train_set(训练集),建立训练集标签,这里我用到两个图像的周长和面积。同时建立测试集和测试标签。

(2)安装libsvm工具

libsvm是非常好用的集成库函数,相比于MATLAB自带的SVM更具有一般性。安装libsvm搜教程即可。。
注意几点:
1.要下载一个c++编译器,跟MATLAB配套的是MingWin64,但是我在安装的过程,出现了很多问题,MingWin64安装并未成功。改用了VS(VisualStudio),在软件管家里找到跟着教程安装即可。从根本上来说,libsvm是用c++编写的库函数,我们在调用的时候是需要编译的。

2.用下面代码去测试你是否安装成果。为什么可以用这个去测试,很多人并不知道。原因是这本身就是MATLAB自带的一个SVM案例,在之后调试的过程,可以先用这里的数据测试,看是否是你的代码有问题,还是数据有问题。

[heart_scale_label,heart_scale_inst]=libsvmread('heart_scale');
model = svmtrain(heart_scale_label,heart_scale_inst) ;
[predict_label,accuracy,dec_values] = svmpredict(heart_scale_label,heart_scale_inst,model);

(3)svmtrain建立模型的参数和核函数问题

一般直接使用为:model=svmtrain(label,data,cmd); label为标签,data为训练数据。SVM默认的是5个参数分别为-s、-t 、-d、-g、-r。
-s 设置svm类型:
0 – C-SVC
1 – v-SVC
2 – one-class-SVM
3 – ε-SVR
4 – n – SVR

-t 设置核函数类型, 默认值为2
0 — 线性核: μ‘∗ν
1 — 多项式核: (γ∗μ‘∗ν+coef0)degree
2 — RBF核: exp(–γ∗∥μ−ν∥2)
3 — sigmoid 核: tanh(γ∗μ‘∗ν+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;
-b 概率估计: 是否计算SVC或SVR的概率估计, 可选值0或1, 默认0;

其中,具体的:

-s svm类型:SVM设置类型(默认0)
0 – C-SVC:C-支持向量分类机;参数C为惩罚系数,C越大表示对错误分类的惩罚越大,适当的参数C对分类Accuracy很关键。
1 --v-SVC:v-支持向量分类机;由于C的选取比较困难,用另一个参数v代替C。C是“无意义”的,v是有意义的。(与C_SVC其实采用的模型相同,但是它们的参数C的范围不同,C_SVC采用的是0到正无穷,该类型是[0,1]。)
2 – 一类SVM:单类别-支持向量机,不需要类标号,用于支持向量的密度估计和聚类。
3 – e -SVR:ε-支持向量回归机,不敏感损失函数,对样本点来说,存在着一个不为目标函数提供任何损失值的区域。
4 – v-SVR:n-支持向量回归机,由于EPSILON_SVR需要事先确定参数,然而在某些情况下选择合适的参数却不是一件容易的事情。而NU_SVR能够自动计算参数。
这里,后两者是针对回归问题的,分类问题与回归问题最大的不同就是label,分类的label是类别,比如+1,-1,回归的label是目标值,可能为任意值;

几种常用核函数的优缺点:

(1)线性核函数形式:
K(x,x′)=xTx′
优点:
方案首选,奥卡姆剃刀定律
简单,可以求解较快一个QP问题
可解释性强:可以轻易知道哪些feature是重要的,
限制:只能解决线性可分问题
(2)多项式核K(x,xi)=((x⋅xi)+1)d

(3)径向基核(RBF)K(x,xi)=exp(−∥x−xi∥2σ2)
优点:
可以映射到无限维
决策边界更为多样
只有一个参数,相比多项式核容易选择
缺点:
可解释性差(无限多维的转换,无法算w)
计算速度比较慢(解一个对偶问题)
容易过拟合(参数选不好时容易overfitting)
Gauss径向基函数则是局部性强的核函数,其外推能力随着参数σ的增大而减弱。多项式形式的核函数具有良好的全局性质。局部性较差。
这种核函数也是最常用的,通常会先尝试这种核函数。
(4)Sigmoid核函数
K(x,xi)=tanh(κ(x,xi)−δ)

二、SVM测试

建立模型,进行预测,显示准确率即可。这一部分就不多说了,按照需求设计就可以了。
另外,MATLAB自带的工具箱CLASSFICATION LEARNER里有集成的好的算法决策树、SVM、KNN、逻辑回归等。2019版的MATLAB工具箱更强大。

在解决这些问题的时候,遇到几个相似又不同的概念,如建模、回归、分类、机器视觉、机器学习、计算机视觉等。。之后有时间会写一篇总结。。写完小论文就转去硬件学习啦。因为始终感觉这些东西无法很好的用在工程上。