SVM(support vector machine)是一个很常用的分类算法。作为一名生信的研究生,我所知道的SVM的应用都有很多,例如:预测分泌蛋白,预测信号肽,预测结合位点等等。那么SVM为什么如此受欢迎呢,我先总结几点,可能不是很全:
1、SVM的策略是结构风险最小化,即在保证分类精度的同时,降低机器学习的VC维,使学习机器在整个样本集上的风险得到控制。换句话讲,SVM在某种程度上可以防止过拟合。
2、SVM模型中实际上起作用的只有离超平面最近的那几个支撑向量,所以SVM对样本数的依赖程度没有其它算法那么高。
3、因为少数样本支撑我们最后得到的分类器,所以在预测的时候速度会比其它算法快。而且还会具有较好的鲁棒性。
4、因为有核函数的存在,SVM可以处理LR本身不能处理的非线性分类问题,同时也简化了运算。
5、引入了松弛变量,使得SVM可以处理一些近似线性可分的分类问题。
但是SVM也有一些不足,体现在以下方面:
1、SVM对缺失数据比较敏感,因为SVM没有处理缺失值的策略,而特征空间的好坏对SVM的性能很重要。
2、SVM对大规模样本的训练比较耗费资源,由于SVM是借助二次规划来求解支撑向量,涉及到了m阶矩阵的运算,因此比较耗时耗内存。
3、SVM本身是一个二分类算法,天生只能解决二分类问题。由此诞生了(OVO SVM 和 OVR SVM)
SVM本身是一个涵盖面很广的算法,而且推导过程相对LR比较复杂,后面又引入了核函数以及松弛变量,因此内容很多。我在啃SVM的时候也花了很多时间,看完了达叔的视频后在晚上也找了很多文章去看,看完了感觉成就感满满。推荐一下这篇文章,写的很详细(https://blog.csdn.net/macyang/article/details/38782399/)
SVM分为三类。第一类是线性可分支撑向量机,针对的是线性可分的数据。第二类是线性支撑向量机,引入松弛变量,正对近似线性可分的数据(存在outlier)。第三类是非线性支撑向量机,引入核函数,通过映射到高维空间,解决非线性问题。
手推SVM(应该是一定要会的)
SVM的一点总结
再总结一下松弛变量
由于SVM目的是寻找一个超平面将数据点分隔,所以SVM的关键点就在于那几个支撑向量。万一数据的噪音比较大,而支撑向量中又存在偏离原本位置较远的点,那么这个outlier对超平面的影响就会很大。因此在线性可分支撑向量机的基础上加上了松弛变量,优划目标变成了下面的形式:
1364959576_9747.jpg
其中第二项叫做惩罚因子,C是超参数,用于控制‘寻找margin最大的超平面’和‘保证数据点偏差最小’的权重。
最后是核函数
前面提到的线性可分支撑向量机和线性支撑向量机都是用于处理找到的超平面都是线性的,那么如果样本没办法用一个平面分隔开呢?核函数就是为了解决这一类的问题。回想一下线性回归中如果目标函数是非线性的解决办法:构造多项式。那么同样,在SVM中也可以通过构造多项式的方法来解决非线性问题,但是回头看看最后得出的分类函数中的<Xi,X>,代表的是两个向量的内积,通过多项式映射后,变成了下图的形式:
1351142890_4908.jpg
但是问题在于对于多个向量进行多项式映射后,得到的数据维度会呈指数增长,给计算带来了很大的不便。那么这个时候就要用到核函数了,核函数可以避免在高维下直接进行运算,但结果与多项式映射是等价的。这样一来,大大提升了运算的速度。
常见的核函数有线性核、多项式核、高斯核、sigmoid核。
当特征跟样本数差不多时,可以直接使用线性核。
多项式核的参数比较多,难调参。
高斯核可以将数据映射到无穷维,有个超参数σ,当σ比较大时,高次特征的权重衰减的很快,实际上相当于一个低维子空间,当σ比较小时,理论上可以将任何数据变得线性可分,但会带来严重的过拟合问题。
以上就是对SVM的一些理解和总结,还有很多不到位的地方以后慢慢改正。
网友评论